重复泛型的打字稿推理
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
中的泛型参数实际上并不满足约束,因为 rec
和 rec2
不是同一类型?或者我误解了这里的推论是如何工作的(可能)。
澄清
另一种提问方式可能是——我如何输入 MyType
或 createMyType
以便在第二个示例中记录错误,因为 rec
和 rec2
不是同一类型 (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: {}}
确实满足那个合同。
有了这个改变,两种用法都会出错。
基本上,为什么 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
)?
您使用的是非严格模式吗?
(此设置在 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: {}}
确实满足那个合同。
有了这个改变,两种用法都会出错。