TypeScript 无法正确推断接受函数作为其参数公开的函数的泛型类型,该函数在调用时应提供泛型参数。
const notWorking = <Value>(callback: (emitValue: (value: Value) => void) => void): void => {
//...
}
notWorking((emitValue) => {
emitValue(123);
});
调用时,此处的
notWorking
函数不会推断任何内容,而是将泛型参数视为 unknown
,即使传递给 emitValue
函数的参数是 number
。
我尝试使用
Value
为 never
泛型参数指定默认值,认为这至少会出错并迫使我为函数提供显式泛型参数,并且在编写下面的代码时它确实有效。
const notWorking = <Value = never>(callback: (emitValue: (value: Value) => void) => void): void => {
//...
}
notWorking<number>((emitValue) => {
emitValue(123);
});
但我现在被迫提供通用参数,我想知道是否有一种方法可以让 TypeScript 对于此类高阶函数的推理更加智能?还是语言本身的限制?
我不确定我的理解是否正确,但如果您不特别希望将泛型放在包含的函数上,则可以将泛型移至函数本身:
const notWorking = (
callback: (emitValue: <Value>(value: Value) => void) => void
): void => {
//...
};
notWorking((emitValue) => {
emitValue(123);
});
由于包含函数是空的,我不太确定为什么你需要那里的泛型。