Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 联合类型作为接口中的键?_Typescript - Fatal编程技术网

Typescript 联合类型作为接口中的键?

Typescript 联合类型作为接口中的键?,typescript,Typescript,是否可以将联合类型用作接口中的键?例如,我想做这样的事情: interface IMargin { [key in 'foo' | 'bar']: boolean; } 但我得到了一个错误: 接口中的计算属性名称必须引用类型为文字类型或“唯一符号”类型的表达式。ts(1169) 这有什么办法吗 用例将值数组转换为接口: const possibleTypes = ['foo', 'bar']; interface Types { foo?: boolean; bar?: b

是否可以将联合类型用作接口中的键?例如,我想做这样的事情:

interface IMargin {
  [key in 'foo' | 'bar']: boolean;
}
但我得到了一个错误:

接口中的计算属性名称必须引用类型为文字类型或“唯一符号”类型的表达式。ts(1169)

这有什么办法吗

用例将值数组转换为接口:

const possibleTypes = ['foo', 'bar'];
interface Types {
    foo?: boolean;
    bar?: boolean;
}

您可以使用对象类型而不是接口,接口通常是可互换的:

type IMargin = {
    [key in 'foo' | 'bar']: boolean;
}

接口不支持映射类型(这正是您在这里所需要的)。您可以使用类型别名,在大多数情况下,它的工作原理应该是相同的(并非所有情况下,但如果已知类型,则可以像实现接口一样实现类型别名)

constpossibletypes=((…o:T)=>o)('foo','bar');
类型=记录

映射类型
记录
应该可以在这里工作

这不一定是答案,但我认为这可能会引起其他人的兴趣

可以将联合类型用作接口的子属性中的键

export type Language = 'EN' | 'DE' | 'IT';

export interface Document {
  generic: string;
  languages: {
    [key in Language]: string[];
  }
}

可能是
类型的键
?嘿,谢谢你的回答。只要您直接传入
('foo','bar')
,就可以了。但是,当您传入
(…['foo','bar'])
时,它不起作用。有办法解决这个问题吗?这里的用例是从数组生成类型或接口。@ElliotBonneville您是指
possibleTypes
中的IIFE?其思想是数组应该是一种文本类型,可以是tuple
['foo','bar']
类型,也可以是array
array
类型。如果你正确地键入了数组,你可以不用IIFE就直接使用它。否则,您需要将其类型断言为上述类型之一的内容。如果只是语法偏好使用数组,那么可以使用
constpossibletypes=((o:T[])=>o)(['foo','bar'])
但我更喜欢原始版本:)@ElliotBonneville
(…['foo','bar'])
不起作用,这是ts的限制。数组文字将在扩展操作之前推断为
字符串[]
,因此文字类型是lostAh,我明白了。这会有更多帮助,我们正在努力!尽管将其应用到我的实际用例中,我仍然感到困惑。我有一种感觉,字符串的字面类型在某个地方的翻译中丢失了。以下是我试图实现的目标:@ElliotBonneville那是一匹不同颜色的马。。很遗憾,您无法从串联创建字符串文字类型。无论如何,您的类型都会丢失,因为参数是可以用泛型解决的
string[]
类型。但是您目前仍然无法在类型系统中将
prefix1_a
生成为字符串文字类型。这很有帮助,谢谢--采用类型而不是接口可以让我在这方面发挥作用。但是,正如您在我对Titian答案的评论中所看到的,我仍然无法从数组中生成联合类型。我得到
接口中的计算属性名称必须引用类型为文字类型或“唯一符号”类型的表达式。ts(1169)
它被视为使用
类型
关键字。如果您使用
类型
而不是
接口
,您也可以在那里使用。
export type Language = 'EN' | 'DE' | 'IT';

export interface Document {
  generic: string;
  languages: {
    [key in Language]: string[];
  }
}