重复泛型的打字稿推理

Typescript inference with repeated generics

基本上,为什么 Typescript 的推理在此处的第二个示例中没有产生错误:

type MyType<TRecord extends Record<string,any>> = {
    rec: TRecord
    rec2: TRecord
}

const myRec = { idFoo: 3 } 

function createMyType<T extends MyType<Record<string,any>>>(obj: T):T {
    return obj
}

const myType = createMyType({
    rec: myRec,
    rec2: 3, // <-- error here as expected
})

const myType2 = createMyType({
    rec: myRec,
    rec2: {}, // <-- no error here
})

换句话说,为什么它没有意识到 createMyType 中的泛型参数实际上并不满足约束,因为 recrec2 不是同一类型?或者我误解了这里的推论是如何工作的(可能)。

Playground

澄清

另一种提问方式可能是——我如何输入 MyTypecreateMyType 以便在第二个示例中记录错误,因为 recrec2 不是同一类型 (TRecord)?

您使用的是非严格模式吗?

(此设置在 tsconfig.json 文件中定义)

您的问题在于您的范围 T。试试这个,其中 T 设置为通用类型而不是整体类型:

function createMyType<T extends Record<string,any>>(obj: MyType<T>): MyType<T> {
    return obj
}

在您之前的示例中,如果 T 扩展合同 {rec: Record<string, any>, rec2: Record<string, any>},则它是有效的。好吧,{rec: {idFoo: number}, rec2: {}} 确实满足那个合同。

有了这个改变,两种用法都会出错。