Typescript学习第二十五天

93 阅读2分钟

这是我参与2022首次更文挑战的第39天,活动详情查看:2022首次更文挑战

赋值兼容性

在赋值兼容性中,any类型能够赋值给任何其他类型,因为any类型时顶端类型,所以any类型不是其他类型的子类型。数值型枚举与number类型,number类型可以赋值给数值型枚举类型,但number类型不是数值型枚举的子类型,但是数值型枚举是number类型的子类型。带有可选属性的对象类型,如果的对象类型X中有可选属性M,那么对象类型Y也可以赋值给对象类型X,即使Y中没有属性M。此例中类型Y能够赋值给类型X,但是类型Y不是类型X的子类型,这是因为类型X中的属性z不能够在类型Y中找到对应的属性定义。

type X = { n: number; z?: number };
type Y = { l: number };
const y: Y = { n: 6 };
const x: X = y

类型推断

当我们声明时赋值了,编译器会自动识别出类型。如果声明变量时没有设置初始值,那么编译器就会默认类型为any。如果函数返回值类型return时能推断出类型。

// any
const y;
// number
const b = 0;

如果数组中有多个类型元素,可能编译器会推断出联合类型。因为编译器会参考每一个数组元素的类型。但是如果我们想要的类型但是编译器无法推断出来,我们可以添加明确的类型注解或者使用类型断言。一般情况下,编译器推断变量类型时由右向左或者自下而上的推断。编译器还可以相反方向进行推断。

interface People {
    (x: number, y:number):number;
}
const num: People = (g, h) => g + h;

类型放宽

当我们给变量赋值为数字字面量类型0时,会识别为类型number。当非严格类型检查模式下,不启用strictNullChecksundefined类型和null类型会被识别为any类型。如果启用strictNullChecks,undefined值的类型还是undefined,null类型还是null类型。字面量类型源自类型是不可放宽的字面量类型。如果字面量类型源自表达式是可以放宽。可放宽的字面量结果为对应的基础原始类型。如果是不可放宽的字面量结果还是字面量类型本身。数组字面量元素可以修改、对象字面量属性值可变、非只读属性具有初始值、let和var给变量赋予了初始值、函数或方法形式参数定义默认值、函数或方法返回值类型是字面量等这些都是放宽的字面量类型。

// 不能放宽
const x: 0 = 0