functionaddNums(a:string,b:number | string):string {return a + b
}
类型谓词 is 类型保护与区分类型 类型保护就是一些表达式,它们会在运行时检查以确保在某个作用域里的类型。 要定义一个类型保护
interfaceBrid{fly():void;}interfaceFish{swim():void}// 当animal is Fish这个表达式成立时返回truefunctionisFish(animal:Brid | Fish):animal is Fish {// 类型谓词 isreturn(<Fish>animal).swim !==undefined;}letanimals:Brid ={fly:function(){
console.log('fly');}}
console.log(isFish(animals));// false
typeof类型保护和instanceof类型保护
classPadder{constructor(readonly name :string){this.name = name
}}functionmyFunc(value:string|number|object):number|undefined|string {if(typeof value ==='string'){return value.length
}if( value instanceofPadder){return value.name
}}
这些* typeof类型保护*只有两种形式能被识别:
typeof v === "typename"和 typeof v !== "typename",
"typename"必须是 "number", "string", "boolean"或 "symbol"。
但是TypeScript并不会阻止你与其它字符串比较,语言不会把那些表达式识别为类型保护。
type Alias ={num: number }interfaceInterface{num: number;}
declare functionaliased(arg: Alias): Alias;
declare functioninterfaced(arg: Interface): Interface;
// 由于这个类使用了 this类型,你可以继承它,新的类可以直接使用之前的方法,不需要做任何的改变。classBasicCalculator{publicconstructor(protectedvalue: number =0){}publiccurrentValue(): number {returnthis.value;}publicadd(operand: number):this{this.value += operand;returnthis;}publicmultiply(operand: number):this{this.value *= operand;returnthis;}}let v =newBasicCalculator(2).multiply(5).add(1).currentValue();
interfacePerson{name:string,age:number
}
type Readonly<T>={
readonly [Pin keyof T]:T[P];}
type Partial<T>={[Pin keyof T]?:T[P];}
type PersonPartial = Partial<Person>;
type ReadonlyPerson = Readonly<Person>;
// 下面来看看最简单的映射类型和它的组成部分:
type Keys ='option1'|'option2';
type Flags ={[Kin Keys]: boolean };// 它的语法与索引签名的语法类型,内部使用了 for .. in。 具有三个部分:// 类型变量 K,它会依次绑定到每个属性。// 字符串字面量联合的 Keys,它包含了要迭代的属性名的集合。// 属性的结果类型。