typescript - Tvinga typning vid användning av bind


Jag försöker skapa en bunden version av en funktion som har sina argument förinställda, men jag kan inte få några typer av typkontroller på bind-metoden.

Här är min kod:

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();

Det verkar som att TypeScript-signaturen för bind för närvarande är

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

Finns det något sätt jag kan få typkontroller att fungera korrekt med bind?

Jag har försökt skapa en index.d.ts men jag är fast på hur man deklarerar funktionsparametrar som generiska.

Svar #1

Det finns ett kompilatoralternativ i 3.2 och nyare, kallat strictBindCallApply dokumenterat här. Du kan också bara aktivera strict vilket också aktiverar strictBindCallApply

Med detta alternativ aktivt kommer du att få ett fel på den här raden:

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

Svar #2

Du kan titta på https://github.com/Microsoft/TypeScript/issues/212

Det verkar som att inte ens MS vet hur man gör bind, call och apply starkt typade