Typescript:传递具有泛型的枚举时,条件类型中的字段类型

m1m5dgzv  于 2022-11-18  发布在  TypeScript
关注(0)|答案(1)|浏览(123)

我有一个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>中,它可以正常工作,而additionalFieldType<MyEnum>中的类型为MyEnum[];
如果这应该是这样工作的,为什么ConditionalType<T = void>会发生这种情况?
这里有一个到Playground的链接

n3h0vuf2

n3h0vuf21#

您通过写入T extends void意外触发了 distributionT中的并集分布在导致并集MyEnum.TEST_1[] | MyEnum.TEST_2[]而不是(MyEnum.TEST_1[] | MyEnum.TEST_2)[]的条件上。
通过将Tvoid Package 在元组内来避免分布。

type ConditionalType<T = void> = {
  someField: string;
} & ([T] extends [void] ? {} : {
  additionalField: T[];
})

Playground

相关问题