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

Ell*_*lle 17 typescript

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

interface IMargin {
  [key in 'foo' | 'bar']: boolean;
}
Run Code Online (Sandbox Code Playgroud)

但我收到此错误:

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

有没有办法解决?

用例是将一组值转换为接口:

const possibleTypes = ['foo', 'bar'];
interface Types {
    foo?: boolean;
    bar?: boolean;
}
Run Code Online (Sandbox Code Playgroud)

Dmi*_*riy 27

您可以使用对象类型而不是接口,它们大多可以互换:

type IMargin = {
    [key in 'foo' | 'bar']: boolean;
}
Run Code Online (Sandbox Code Playgroud)

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

Pab*_*iva 17

这不一定是答案,但我认为这可能会让其他人感兴趣。

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

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

export interface Document {
  generic: string;
  languages: {
    [key in Language]: string[];
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 它的处理方式类似于使用“type”关键字。如果您使用“type”而不是“interface”,您也可以在那里执行此操作。 (3认同)

Tit*_*mir 5

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

const possibleTypes = (<T extends string[]>(...o: T) => o)('foo', 'bar');
type Types = Record<typeof possibleTypes[number], boolean>
Run Code Online (Sandbox Code Playgroud)

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