我有一个Type<T>
,它应该有一个additionalField
类型的字段,我需要把这个字段设置为可选的,这取决于是否有泛型被传递,所以我引入了一个ConditionalType<T = void>
,如果我没有传递泛型,那么就没有additionalField
.
所以我有一个枚举MyEnum
,在ConditionalType<MyEnum>
中,我希望additionalField
的类型是MyEnum[]
,而additionalField
的类型是MyEnum.TEST_1[] | MyEnum.TEST_2[]
。
下面是完整的代码:
type ConditionalType<T = void> = {
someField: string;
} & (T extends void ? {} : {
additionalField: T[];
})
type Type<T> = {
someField: string;
additionalField: T[];
}
enum MyEnum {
TEST_1 = "test_1",
TEST_2 = "test_2"
}
const a: ConditionalType<MyEnum>;
a.additionalField
// (property) additionalField: MyEnum.TEST_1[] | MyEnum.TEST_2[]
// Need to make it MyEnum[] somehow
const b: Type<MyEnum>;
b.additionalField;
// (property) additionalField: MyEnum[]
// Works as expected
有人能告诉我,我怎样才能使additionalField
成为ConditionalType<MyEnum>
中的MyEnum.TEST_1[] | MyEnum.TEST_2[]
类型的MyEnum[]
?在原来的Type<T>
中,它可以正常工作,而additionalField
在Type<MyEnum>
中的类型为MyEnum[]
;
如果这应该是这样工作的,为什么ConditionalType<T = void>
会发生这种情况?
这里有一个到Playground的链接
1条答案
按热度按时间n3h0vuf21#
您通过写入
T extends void
意外触发了 distribution。T
中的并集分布在导致并集MyEnum.TEST_1[] | MyEnum.TEST_2[]
而不是(MyEnum.TEST_1[] | MyEnum.TEST_2)[]
的条件上。通过将
T
和void
Package 在元组内来避免分布。Playground