类型推断不适用于 TypeScript 中的高阶函数

问题描述 投票:0回答:1

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 对于此类高阶函数的推理更加智能?还是语言本身的限制?

typescript function type-inference higher-order-functions
1个回答
0
投票

我不确定我的理解是否正确,但如果您不特别希望将泛型放在包含的函数上,则可以将泛型移至函数本身:

const notWorking = (
  callback: (emitValue: <Value>(value: Value) => void) => void
): void => {
  //...
};

notWorking((emitValue) => {
  emitValue(123);
});

由于包含函数是空的,我不太确定为什么你需要那里的泛型。

© www.soinside.com 2019 - 2024. All rights reserved.