为什么在这种简单情况下Typescript会推断出一个空对象

时间:2018-10-19 16:04:16

标签: typescript

选中此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告诉他仅根据第一个参数进行推断,而不能根据第二个参数进行推断,因为这显然使人感到困惑?

1 个答案:

答案 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
}