为什么我的SupposedId
类型不是类型标识?
Typescript抱怨Type 'T' is not assignable to type 'SupposedId<T>'
.
为什么T
不能分配给T
或T
,我错过了什么?
type SupposedId<T> = T extends object ? T : T;
function makeId<T>(test: T): SupposedId<T> {
return test // <- Type 'T' is not assignable to type 'SupposedId<T>'
}
操场例子
这是因为分布式条件类型。supposed did分发给T extends any | T extends object
。您的情况当然是一个新颖的情况,因为它们实际上都解析为T
,但条件类型根据是否T extends object
执行不同的窄化。
但是,根据文档,您可以通过在extends关键字的两边添加方括号来修复它:
type SupposedId<T> = [T] extends [object] ? T : T;
function makeId<T>(test: T): SupposedId<T> {
/* `test` is now one of `T extends object` or `T extends any`,
not `T extends object | T extends any` */
return test;
}