【TypeScript入门】基础(三):类型推论和联合类型

类型推论

如果没有明确的指定类型,那么 TypeScript 会依照类型推论(Type Inference)的规则推断出一个类型。

什么是类型推论

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

let myName = 'seven';
myName = 7;

// Type 'number' is not assignable to type 'string'.

事实上,它等价于:

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

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

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

let myName;
myName = 'seven';
myName = 7;

联合类型

联合类型(Union Types)表示取值可以为多种类型中的一种。联合类型用 | 分割每个类型。

联合类型的例子

let myName: string | number;
myName = 'Tom'; // ok
myName = 18; // ok

myName = true; // Type 'boolean' is not assignable to type 'string | number'. Type 'boolean' is not assignable to type 'number'.

这里的 let myName: string | number 的含义是允许 myName 的类型是 string 或者 number, 但是不能是其他的类型。

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

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

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

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

访问共有length 属性的类型就不会报错:

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

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

let myName: string | number;
myFavoriteNumber = 'Tom';
console.log(myName.length); // 5
myName = 17;
console.log(myFavoriteNumber.length); // 编译时报错
// Property 'length' does not exist on type 'number'

上例中,第二行的 myName 被推断成了 string,访问它的 length 属性不会报错。而第四行的 myName 被推断成了 number,访问它的 length 属性时就报错了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

small_Axe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值