基本上,为什么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
中的泛型参数实际上并不满足约束,因为rec
和rec2
不是同一类型?或者我误解了这里的推论是如何运作的(可能(。
游乐场
澄清
另一种提问方式可能是——我如何键入MyType
或createMyType
,以便在第二个示例中注意到错误,因为rec
和rec2
不是同一类型(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文件中定义(