如何使用两次联合来编写一个typescript模板文字,而不出现无效排列?

ntjbwcob  于 2022-12-14  发布在  TypeScript
关注(0)|答案(1)|浏览(95)

我目前正在尝试整理如何创建一个字符串类型来Map表和字段${Table}.${Field} as ${Field},但是我似乎不能正确地得到typescript类型。
文档并不十分清楚当一个联合被多次使用时会发生什么。
看起来TypeScript会将样板常值型别中的每一个替代都视为彼此独立,因此如果您在样板常值中指定相同的替代,而泛型值是等位,它会将相同变数的不相符替代视为有效。有没有方法可以避免这种情况,以便当我想要在样板中使用等位中的相同值两次时,它会使用相同的值?
typescript 4.9.4

type QualifiedField<Table extends string, Field extends string> = Field | `${Table}.${Field} as ${Table}_${Field}`;

let test: QualifiedField<'test', 'BIG' | 'small'>;
test = 'BIG'; // ✅ Wanted
test = 'small'; // ✅ Wanted
test = 'test.BIG as test_BIG'; // ✅ Wanted
test = 'test.BIG as test_small'; // ❌ I don't want this
test = 'test.small as test_small'; // ✅ Wanted
test = 'test.small as test_BIG'; // ❌ I don't want this
test = 'this fails'; // ✅ Expected error: Type '"this fails"' is not assignable to type...
nkhmeac6

nkhmeac61#

我们可以通过在Field上分布条件类型来防止无效排列,在条件类型中,我们将每个组成部分存储在新的推断类型F中。对于Field并集上的每个 “迭代”F类型都保证是非并集字符串文本类型。

type QualifiedField<Table extends string, Field extends string> = 
  Field | (Field extends infer F extends string 
    ? `${Table}.${F} as ${Table}_${F}` 
    : never
  )

Playground

相关问题