我有一台DeepWriteable
型的和一台PositiveNumber
号的.PositiveNumber
是number
的延伸,但DeepWriteable<PositiveNumber>
不是.品牌字符串类型的情况也是如此.这里发生了什么事?
type DeepWriteable<T> = { -readonly [P in keyof T]: DeepWriteable<T[P]> };
type PositiveNumber = number & { __brand: 'PositiveNumber' };
type NonEmptyString = string & { __brand: 'NonEmptyString' };
type test1 = PositiveNumber extends number ? true : false;
// TRUE
type test2 = DeepWriteable<PositiveNumber> extends number ? true : false;
// FALSE
type test3 = NonEmptyString extends string ? true : false;
// TRUE
type test4 = DeepWriteable<NonEmptyString> extends string ? true : false;
// FALSE
(顺便说一句,我只是问品牌类型,因为普通的number
和string
似乎没有这种行为)
type test5 = DeepWriteable<number> extends number ? true : false;
// TRUE
type test6 = DeepWriteable<string> extends string ? true : false;
// TRUE
我求助于只在DeepWriteable
上加一个复选标记,以不映射超过number
和string
的值,这很好用,但我很好奇为什么这是必要的.
这是因为-readonly
转换使其成为非同态映射类型吗?我想我也许能明白为什么string
会发生这种情况,因为length
是readonly
.number
号有没有类似的readonly
号房源?