我目前正在尝试整理如何创建一个字符串类型来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...
1条答案
按热度按时间nkhmeac61#
我们可以通过在
Field
上分布条件类型来防止无效排列,在条件类型中,我们将每个组成部分存储在新的推断类型F
中。对于Field
并集上的每个 “迭代”,F
类型都保证是非并集字符串文本类型。Playground