我正在尝试从键的联合类型创建映射类型。为了有一个最小的例子,这些类型只是映射到它们自己。以下泛型返回预期结果
type Foo<Bar extends string> = {[name in Bar]: name}
type test = Foo<'test1' | 'test2'> //test = {test1: 'test1', test2: 'test2'}
但是,如果undefined
不是字符串,我想删除字符串约束并只返回Bar
。我是通过以下方式完成的
type Foo<Bar> = Bar extends string ? {[name in Bar]: name} : undefined
type test = Foo<'test1' | 'test2'>
//expected result: test = {test1: 'test1', test2: 'test2'}
//actual result: test = {test1: 'test1'} | {test2: 'test2'}
test
现在是联合类型,而不是简单的映射类型。
这是打字稿中的预期行为还是我应该提交错误报告?有什么方法可以得到我想要的行为吗?
P.S。如果可以提供帮助,我正在尝试修复this行。
答案 0 :(得分:3)
是的,这是预期的行为,通常称为distributive conditional types。
但是有时候,就像您的示例一样,它会妨碍您的工作。解决方法是将Bar
类型的参数包装在[]
when it's used in condition test中:
type Foo1<Bar extends string> = {[name in Bar]: name}
type test1 = Foo1<'test1' | 'test2'> //test1 = {test1: 'test1', test2: 'test2'}
type Foo2<Bar> = [Bar] extends [string] ? {[name in Bar]: name} : undefined;
type test2 = Foo2<'test1' | 'test2'> //test2 = {test1: 'test1', test2: 'test2'}
type test3 = Foo2<1>; // undefined