函数表达式
function greeter(fn:(a:string)=>void){
fn("Hello World")
}
function printToConsole(s:string){
console.log(s)
}
(a:string) => void
别名定义
type GreetFunction = (a:string) => void
function 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):Date
function makeDate(m:number,d:number,y:number):Date
function 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 right
function 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的类型