选中此playground进行实时演示。
给出以下代码:
type Transformer<T> = (t: T) => T;
const identity = <T>(a: T) => a;
interface HardInferenceFn {
<T>(value: T, transform: Transformer<T> | T): T
}
declare const hardInference: HardInferenceFn;
const myTransformedValue = hardInference('foo', identity);
从逻辑上讲,myTransformedValue
的类型应为string
,但它是一个空对象。
通过玩耍,我发现使tsc令人困惑的是转换参数周围的| T
,如果我们将其取出,则myTransformedValue将具有预期的类型。
为什么会这样?另外,是否有一种方法可以帮助tsc告诉他仅根据第一个参数进行推断,而不能根据第二个参数进行推断,因为这显然使人感到困惑?
答案 0 :(得分:2)
您可以使用此:
export type NoInfer<T> = T & {[K in keyof T]: T[K]};
映射类型会延迟推断: https://github.com/Microsoft/TypeScript/issues/14829#issuecomment-322267089
现在应该可以使用:
interface HardInferenceFn {
<T>(value: T, transform: Transformer<NoInfer<T>> | T): T
}