#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 (пожалуйста, удалите ответ, поскольку он фактически неверен)