函数表达式
function greeter(fn:(a:string)=>void){fn("Hello World")}function printToConsole(s:string){console.log(s)}
(a:string) => void
别名定义
type GreetFunction = (a:string) => voidfunction greeter(fn:GreetFunction){}
调用签名
调用签名 与函数表达式区别就在于 => 和 :
type Desc = {desc:string(someArg:number):boolean}function doSm(fn:Desc){console.log(fn.desc + "return" + fn(6))}function fn1(n:number){return true}fn1.desc = '123'dmSm(fn1)
构造签名
type SC = {new (s:string):SomeObject}function fn(ctor:SC){return new ctor("hello")}
interface CallOrConstruct {new (s: string): Date;(n?: number): number;}
泛型函数
function firstElement<T>(arr:T[]):T|undefined{return arr[0]}
最少参数原则
function greet<Str extends string>(s: Str) {console.log("Hello" + s);}function greet(s: string) {console.log("Hello" + s);}
函数重载
function makeDate(ts:number):Datefunction makeDate(m:number,d:number,y:number):Datefunction makeDate(mOrt:number,d?:number,y?:number):Date{if(d!==undefined && y!== undefined){return new Date(y,mOrt,d)}else{return new Date(mOrt)}}const d1 = makeDate(12345678);const d2 = makeDate(5, 5, 5);//没有需要 2 参数的重载,但存在需要 1 或 3 参数的重载。const d3 = makeDate(1, 3);function fn(x: string): string;// Return type isn't rightfunction fn(x: number): boolean;//实现签名 返回 string 没有boolean 和 重载签名不一致function fn(x: string | number) {return "oops";}
需要注意 当实现了兼容签名函数的实现后,尽管我们声明了 可选参数,但TS 认为 实现签名 需要和重载签名进行相应匹配
尽可能使用联合类型代替重载
function len(s: string): number;function len(arr: any[]): number;function len(x: any) {return x.length;}↓function len(x: any[] | string) {return x.length;}
this
Ts会自己在代码流中分析 this的类型, 并且允许你再函数体内声明 this的类型
