Принудительное ввод при использовании bind

#typescript #function-binding

#typescript #функция-привязка

Вопрос:

Я пытаюсь создать связанную версию функции, аргументы которой предварительно заданы, однако я не могу получить какие-либо проверки типа для 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();
  

Похоже, что в настоящее время подпись TypeScript bind равна

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

Есть ли какой-либо способ заставить проверки типов корректно работать с bind ?

Я пытался создать index.d.ts , но я застрял на том, как объявлять параметры функции как универсальные.

Ответ №1:

В 3.2 и более новых версиях есть опция компилятора, которая называется strictBindCallApply documented here. Вы также можете просто включить strict , что также позволяет strictBindCallApply

Если эта опция активна, вы получите сообщение об ошибке в этой строке:

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

Ответ №2:

Вы можете посмотреть на https://github.com/Microsoft/TypeScript/issues/212

Кажется, что даже MS не знает, как выполнить привязку, вызвать и применить строго типизированный

Комментарии:

1. Проблема помечена как исправленная и ссылается на PR, на который я ссылаюсь в своем ответе. Теперь это возможно с версии 3.2 (пожалуйста, удалите ответ, поскольку он фактически неверен)