Typescript三元操作符破坏标识类型



为什么我的SupposedId类型不是类型标识?

Typescript抱怨Type 'T' is not assignable to type 'SupposedId<T>'.

为什么T不能分配给TT,我错过了什么?

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;
}

最新更新