3-TypeScript 类型推论-别名-字面量类型-断言-字符串字面量类型

类型推论

什么是类型推论

以下代码虽然没有指定类型,但是会在编译的时候报错:

let myFavoriteNumber = 'seven';//虽然没有给数据类型,但可以通过赋的值推论出来
myFavoriteNumber = 7; // error 报错,必须是字符串类型

事实上,它等价于:

let myFavoriteNumber: string = 'seven';
myFavoriteNumber = 7;

TypeScript 会在没有指定类型的时候推测出一个类型,这就是类型推论。

如果定义的时候没有赋值,不管之后有没有赋值,都会被推断成 any 类型而完全不被类型检查

let myFavoriteNumber;
myFavoriteNumber = 'seven';
myFavoriteNumber = 7;

联合类型

联合类型(Union Types)表示取值可以为多种类型中的一种.

let myFavoriteNumber: string | number;
myFavoriteNumber = 'seven';//可以是字符串
myFavoriteNumber = 7;//可以是number

联合类型使用 | 分隔每个类型。

访问联合类型的属性和方法

当 TypeScript 不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型里共有的属性或方法

function getLength(something: string | number): number {
  return something.length;
}
// error TS2339: Property 'length' does not exist on type 'string | number'. Property 'length' does not exist on type 'number'.

上例中,length 不是 stringnumber 的共有属性,所以编译器报错。

访问 stringnumber 的共有属性是没问题的:

function getString(something: string | number): string {
  return something.toString();
}

联合类型的变量在被赋值的时候,会根据类型推论的规则推断出一个类型:

let myFavoriteNumber: string | number;
myFavoriteNumber = 'seven';
console.log(myFavoriteNumber.length);
myFavoriteNumber = 7;
console.log(myFavoriteNumber.length); // error TS2339: Property 'length' does not exist on type 'number'.

在上例中,第 2 行 myFavoriteNumber 被推断成 string 类型,因此访问其 length 属性不会报错。而第 4 行被推断成 number,访问 length 就报错了。

类型断言

断言就是假设的意思

类型断言(Type Assertion)可以用来手动指定一个值的类型。

语法

<type> value //格式
//示例
function getLength(something: string | number): number {
    return (<string>something).length;
  }//在react里慎用,于jsx语法冲突,会当成非法组件

// or

value as type //格式
//示例
function getLength(something: string | number): number {
    return (something as string).length;
  }

tsx 中必须使用后面一种。

前面在联合类型中我们提到过,当 Typescript 不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型里共有的属性或方法

function getLength(something: string | number): number {
  return something.length;
}

// error TS2339: Property 'length' does not exist on type 'string | number'. Property 'length' does not exist on type 'number'.

在这里,我们希望访问 length 属性:

function getLength(something: string | number): number {
  if (something.length) {
    return something.length;
  } else {
    return something.toString().length;
  }
}

// error TS2339: Property 'length' does not exist on type 'string | number'. Property 'length' does not exist on type 'number'.

在上例中,访问 something.length 的时候会报错,因为 length 并不是公共属性。此时,我们就可以使用类型断言,将 something 断言成 string

function getLength(something: string | number): number {
  if ((<string>something).length) {
    return (something as string).length;
  } else {
    return something.toString().length;
  }
}

类型断言不是类型转换,断言成一个联合类型中不存在的类型是不允许的

function toBoolean(something: string | number): boolean {
  return <boolean>something;
}

// error TS2352: Conversion of type 'string | number' to type 'boolean' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first. Type 'number' is not comparable to type 'boolean'.

类型别名

类型别名用来给一个类型起个新名字,常用于联合类型。

type Name = string;
type NameResolver = () => string;
type NameOrResolver = Name | NameResolver;
function getName(n: NameOrResolver): Name {
  if (typeof n === 'string') {
    return n;
  } else {
    return n();
  }
} 

字符串字面量类型

字符串字面量类型用来约束取值只能是某几个字符串中的一个。

type EventNames = 'click' | 'scroll' | 'mousemove';
function handleEvent(ele: Element | null , event: EventNames) {
  // do something
}

handleEvent(document.querySelector('hello'), 'scroll');
handleEvent(document.querySelector('world'), 'dbclick'); // error 报错,只能取EventNames 里面的字符串

上例中,我们使用 type 定了一个字符串字面量类型 EventNames,它只能取三种字符串中的一种。

类型别名与字符串字面量类型都是使用 type 进行定义。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我来回答你的问题。 1. TypeScript类型保护与区分类型 类型保护是 TypeScript 中用来区分不同类型的机制,可以通过 typeof、instanceof、in 等运算符来实现。例如: ```typescript function printLength(strOrArr: string | any[]) { if (typeof strOrArr === 'string') { console.log(strOrArr.length); // string类型 } else { console.log(strOrArr.length); // 数组类型 } } ``` 2. TypeScript 的联合类型 联合类型是指变量可以是多种不同类型之一,可以使用“|”符号将多个类型组合起来。例如: ```typescript let numOrStr: number | string = 5; numOrStr = "hello"; ``` 3. TypeScript 的交叉类型 交叉类型是指将多个类型合并成一个类型,可以使用“&”符号将多个类型组合起来。例如: ```typescript interface A { a: number; } interface B { b: string; } type C = A & B; const c: C = { a: 1, b: "hello" }; ``` 4. TypeScript类型别名 类型别名是为一个类型定义一个别名,可以使用“type”关键字来定义。例如: ```typescript type MyString = string; const str: MyString = "hello"; ``` 5. TypeScript 的接口 vs. 类型别名 接口和类型别名都可以用来定义类型,但有一些不同之处。接口可以被类实现,也可以被扩展,而类型别名只能定义别名。例如: ```typescript interface Person { name: string; age: number; } type PersonAlias = { name: string; age: number; }; class Student implements Person { name: string; age: number; grade: number; constructor(name: string, age: number, grade: number) { this.name = name; this.age = age; this.grade = grade; } } type StudentAlias = PersonAlias & { grade: number; }; const student: StudentAlias = { name: "Tom", age: 18, grade: 3 }; ``` 6. TypeScript字符串字面量类型 字符串字面量类型是指将字符串字面量作为类型,可以使用“|”符号将多个字符串字面量组合起来。例如: ```typescript type Gender = "male" | "female"; interface Person { name: string; age: number; gender: Gender; } const person: Person = { name: "Tom", age: 18, gender: "male" }; ``` 希望这些解释能够对你有所帮助。如果你还有其他问题,可以继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值