宿迁市建设局网站首页,wordpress主页内容修改,网络营销推广策略,个人网站怎样申请TS 能推导出函数体中的类型#xff0c;但多数情况下无法推导出参数的类型#xff0c;只有少数特殊情况下能根据上下文推导参数的类型。返回类型能推导出#xff0c;不过也可以显式注解。
1 声明和调用函数
一般来说#xff0c;在方法中的this值为调用该方法时位于点号左侧… TS 能推导出函数体中的类型但多数情况下无法推导出参数的类型只有少数特殊情况下能根据上下文推导参数的类型。返回类型能推导出不过也可以显式注解。
1 声明和调用函数
一般来说在方法中的this值为调用该方法时位于点号左侧的对象
let x {fun() {console.log(this);}
}
x.fun(); // { fun: [Function: fun] }
let fun x.fun;
fun(); // undefined
如果在函数中有使用到this则上面的方法定义是可能会带来风险的this不能保证为想要的类型。
我们可以在函数的第一个参数中声明this的类型来规避上面的风险。
let x {fun(this: Date) {console.log(this.getDate());}
}
let date new Date();
x.fun.bind(date)(); // 27
//x.fun(); // The this context of type { fun(this: Date): void; } is not assignable to methods this of type Date
1.1 函数类型重载
重载函数即有多个调用签名的函数。
type Reserve {(from: Date, to: Date, destination: String):String,(from: Date, destination: String):String
}
let reserve: Reserve (from: Date, to: Date | String,destination?: String) {return destination: destination;
}
reserve(new Date(), new Date(),hello);
reserve(new Date(),ts);
注意我们在调用函数时参数类型不是参照这个函数定义时的类型而是这个函数的签名例如上面如果参照函数定义则函数调用可以为 图 函数调用失败
如上图所示上面的调用方式将会报错。
1.1.1 DOM 中的重载
浏览器DOM API有大量重载例如createElement方法。参数为表示HTML标签的字符串返回值为对应类型的HTML元素其函数定义为
type CreateElement {(tag: a): HTMLAnchorElement,(tag: canvas): HTMLCanvasElement,(tag: table): HTMLTableElement,(tag: string): HTMLElement
}
2 多态
在类型层面施加约束的占位类型也称多态类型参数。
type Filter {T(array: T[], f: (item: T) boolean): T[]
}
let filter: Filter (array, f) {let arr []for (let item of array) {if (f(item)) arr.push(item);}return arr;
}
filter([2,5,7,6],(_) _ 5); // [7,6]
T在调用签名中声明位于签名的开始圆括号前面TS将在调用该类型的函数时为T绑定具体类型。
而如果把T的作用域限定在类型别名中TS则要求在使用类型别名时显式绑定类型
type FilterT {(array: T[], f: (item: T) boolean): T[]
}
let filter: Filternumber (array, f) {let arr []for (let item of array) {if (f(item)) arr.push(item);}return arr;
}
filter([2,5,7,6],(_) _ 5); // [7,6]
2.1 受限的多态
TS 多态可以像Java一样使用extends来约束多态但不能使用super。
type TreeNode {value: string
}
type LeafNode TreeNode {isLeaf: true
}
type InnerNode TreeNode {children: [TreeNode] | [TreeNode,TreeNode]
}
function mapNodeT extends TreeNode(node: T,f: (value: string) string) : T {return {...node,value: f(node.value)}
}
2.2 泛型默认类型
泛型参数可以指定默认类型。
type AString {value: a
}
type BNum {num: 1
}
type MyStringT extends AString AString BNum {value: T
}
let myString: MyString {value: { value: a, num: 1}
}