使用绑定时强制输入

Enforce typings when using bind

我正在尝试创建一个函数的绑定版本,它的参数是预先设置的,但是我无法对 bind 方法进行任何类型的检查。

这是我的代码:

interface I {
  a: string;
  b: string;
}

function doSomethingWithValue(value: I) {
  // Do something
}

const ivalue: I = { a: 'a', b: 'b' };

// No error as expected.
doSomethingWithValue(ivalue);

//"Argument of type '"a"' is not assignable to parameter of type 'I'" as expected.
doSomethingWithValue('a');

// No error. Not what I expected
const bound = doSomethingWithValue.bind(null, 'a');

// Will fail
bound();

目前 bind 的 TypeScript 签名似乎是

bind(this: Function, thisArg: any, ...argArray: any[]): any;

有什么方法可以使类型检查与 bind 一起正常工作?

我已经尝试创建一个 index.d.ts,但我对如何将函数参数声明为泛型感到困惑。

3.2 和更新版本中有编译器选项,称为 strictBindCallApply,记录在 here 中。您也可以只启用 strict,这也会启用 strictBindCallApply

启用此选项后,您将在以下行收到错误消息:

const bound = doSomethingWithValue.bind(null, 'a');

你可以看看https://github.com/Microsoft/TypeScript/issues/212

好像连MS都不知道bind, call, apply是强类型的