函数表达式
  1. function greeter(fn:(a:string)=>void){
  2. fn("Hello World")
  3. }
  4. function printToConsole(s:string){
  5. console.log(s)
  6. }

(a:string) => void

别名定义
  1. type GreetFunction = (a:string) => void
  2. function greeter(fn:GreetFunction){
  3. }
调用签名

调用签名 与函数表达式区别就在于 => 和 :

  1. type Desc = {
  2. desc:string
  3. (someArg:number):boolean
  4. }
  5. function doSm(fn:Desc){
  6. console.log(fn.desc + "return" + fn(6))
  7. }
  8. function fn1(n:number){
  9. return true
  10. }
  11. fn1.desc = '123'
  12. dmSm(fn1)
构造签名
  1. type SC = {
  2. new (s:string):SomeObject
  3. }
  4. function fn(ctor:SC){
  5. return new ctor("hello")
  6. }
  1. interface CallOrConstruct {
  2. new (s: string): Date;
  3. (n?: number): number;
  4. }
泛型函数
  1. function firstElement<T>(arr:T[]):T|undefined{
  2. return arr[0]
  3. }
最少参数原则
  1. function greet<Str extends string>(s: Str) {
  2. console.log("Hello" + s);
  3. }
  4. function greet(s: string) {
  5. console.log("Hello" + s);
  6. }
函数重载
  1. function makeDate(ts:number):Date
  2. function makeDate(m:number,d:number,y:number):Date
  3. function makeDate(mOrt:number,d?:number,y?:number):Date{
  4. if(d!==undefined && y!== undefined){
  5. return new Date(y,mOrt,d)
  6. }else{
  7. return new Date(mOrt)
  8. }
  9. }
  10. const d1 = makeDate(12345678);
  11. const d2 = makeDate(5, 5, 5);
  12. //没有需要 2 参数的重载,但存在需要 1 或 3 参数的重载。
  13. const d3 = makeDate(1, 3);
  14. function fn(x: string): string;
  15. // Return type isn't right
  16. function fn(x: number): boolean;
  17. //实现签名 返回 string 没有boolean 和 重载签名不一致
  18. function fn(x: string | number) {
  19. return "oops";
  20. }

需要注意 当实现了兼容签名函数的实现后,尽管我们声明了 可选参数,但TS 认为 实现签名 需要和重载签名进行相应匹配

尽可能使用联合类型代替重载
  1. function len(s: string): number;
  2. function len(arr: any[]): number;
  3. function len(x: any) {
  4. return x.length;
  5. }
  6. function len(x: any[] | string) {
  7. return x.length;
  8. }
this

Ts会自己在代码流中分析 this的类型, 并且允许你再函数体内声明 this的类型