TS断言
类型断言好比其他语言里的类型转换,但是不进行特殊的数据检查和解构,它没有运行时的影响,只是在编译阶段起作用。
类型断言有两种形式:
-
尖括号语法
-
let someValue:any = "this is a string"; let strLength:number = (<string>someValue).length
-
as 语法
-
let someValue:any = "this is a string"; let strLength:number = (someValue as string).length
类型守卫
类型保护是可执行运行时检查的一种表达式,用于确保改类型在一定范围内。也就是类型保护可以保证一个字符串是一个字符串,尽管它的值也可以是一个数值。类型保护与特性检测并不是完全不同,其主要思想是尝试检测属性、方法或原型,以确定如何处理值。目前主要有四种的方式来实现类型保护:
-
in关键字
-
interface Admin { name: string; privileges: string[]; } interface Employee { name: string; startDate: Date; } type UnknownEmployee = Employee | Admin; function printEmployeeInformation(emp: UnknownEmployee) { console.log("Name: " + emp.name); if ("privileges" in emp) { console.log("Privileges: " + emp.privileges); } if ("startDate" in emp) { console.log("Start Date: " + emp.startDate); } }
-
typeof关键字
-
function padLeft(value: string, padding: string | number) { if (typeof padding === "number") { return Array(padding + 1).join(" ") + value; } if (typeof padding === "string") { return padding + value; } throw new Error(`Expected string or number, got '${padding}'.`); }
- typeof类型保护只支持两种形式:typeof v === ‘typename’ 和typeof v ! ==typename,'typename’必须是number,string,boolean或symbol。但是TS并不会阻止你与其他字符串比较,语言不会把那些表达式识别为类型保护。
-
instanceof关键字
-
interface Padder { getPaddingString(): string; } class SpaceRepeatingPadder implements Padder { constructor(private numSpaces: number) {} getPaddingString() { return Array(this.numSpaces + 1).join(" "); } } class StringPadder implements Padder { constructor(private value: string) {} getPaddingString() { return this.value; } } let padder: Padder = new SpaceRepeatingPadder(6); if (padder instanceof SpaceRepeatingPadder) { // padder的类型收窄为 'SpaceRepeatingPadder' }
-
-
自定义类型保护的类型谓词
-
function isNumber(x: any): x is number { return typeof x === "number"; } function isString(x: any): x is string { return typeof x === "string"; }
-
联合类型和类型别名
-
联合类型
联合类型通常与null和undefined一起使用:
const sayHello = (name:string | undefined)=>{ ...todo } 此处name的类型是string|undefined,意味着可以将string或undefined的值串给sayHello函数。 sayHello('mery'); sayHello(undefined);
类型A和类型B联合后的类型是同时接受A和B值的类型。
-
可辨识联合
-
TS可辨识联合来行,也成为代数数据类型或标签联合类型。它包含3个要点:可辨识、联合类型和类型守卫。
-
这种类型的本质是结合类型和字面量类型的而一种类型保护方法,若一个类型是多个类型的联合类型,且多个;欸行含有一个公共属性,那么就可以利用这个公共属性,来创建不同的类型保护去块。
-
可辨识
可辨识要求联合类型中的每个元素都含有一个单例类型属性,如:
enum CarTransmission { Automatic = 200, Manual = 300 } interface Motorcycle { type: "motorcycle"; // discriminant make: number; // year } interface Car { type: "car"; // discriminant transmission: CarTransmission } interface Truck { type: "truck"; // discriminant capacity: number; // in tons }
上述代码的三个接口中都包含一个type属性,该属性被称为可辨识的属性,而其他的属性只跟特性的接口有关。
-
联合类型
基于之前的三个接口,我们可以创建一个联合类型:
type veh = Motorcycle | Car |Truck
然后我们可以开始使用veh联合类型,对于veh类型的变量,它可以表示不同类型的车辆。
-