具有重复泛型的打字推理



基本上,为什么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不是同一类型?或者我误解了这里的推论是如何运作的(可能(。

游乐场

澄清

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

您的问题是在哪里确定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: {}}确实满足了该合同。

此更改后,两种用途都将出错。

您是否使用非严格模式?

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

最新更新