Skip to content
作者:Yuan Tang
更新于:5 个月前
字数统计:378 字
阅读时长:1 分钟

如果一个变量要套用另一个函数类型,有一个小技巧,就是使用typeof运算符。

function add(
  x:number,
  y:number
) {
  return x + y;
}

const myAdd:typeof add = function (x, y) {
  return x + y;
}

这是一个很有用的技巧,任何需要类型的地方,都可以使用typeof运算符从一个值获取类型。

函数类型还可以采用对象的写法。

let add:{
  (x:number, y:number):number
};
 
add = function (x, y) {
  return x + y;
};

上面示例中,变量add的类型就写成了一个对象。

函数类型的对象写法如下。

{
  (参数列表): 返回值
}

注意,这种写法的函数参数与返回值之间,间隔符是冒号:,而不是正常写法的箭头=>,因为这里采用的是对象类型的写法,对象的属性名与属性值之间使用的是冒号。

这种写法平时很少用,但是非常合适用在一个场合:函数本身存在属性。

function f(x:number) {
  console.log(x);
}

f.version = '1.0';

上面示例中,函数f()本身还有一个属性version。这时,f完全就是一个对象,类型就要使用对象的写法。

let foo: {
  (x:number): void;
  version: string
} = f;

函数类型也可以使用 Interface 来声明,这种写法就是对象写法的翻版,详见《Interface》一章。

interface myfn {
  (a:number, b:number): number;
}

var add:myfn = (a, b) => a + b;

上面示例中,interface 命令定义了接口myfn,这个接口的类型就是一个用对象表示的函数。

Contributors

Yuan Tang