网站搜索

typescript - 我如何定义被枚举约束的接口属性?


假设我需要定义一个物体的形状,比如:

const orange = {
   color: 'red',
   sweet: true,
   acidic: true,
   bitter: false
}

使用 interface

interface Fruit {
   color: string,
   ?
}

未知部分(口味)应当通过以下enum进行约束(仅允许以下键,不一定要全部使用):

enum Taste {
   ACIDIC = 'acidic',
   SWEET = 'sweet',
   BITTER = 'bitter'
}

具有相应的布尔类型值。

我本可以定义一些 Record<Taste, boolean>,但是当我不能将 Fruit 定义为类型(而不是接口),因为它继承了 Food 接口时,我如何将其 纳入 我的目标 Fruit 接口呢?(为了更复杂一些)

答案#1

TypeScript 接口支持多重继承

你应该能够做到

enum Taste {
   ACIDIC = 'acidic',
   SWEET = 'sweet',
   BITTER = 'bitter'
}

interface Food { /* props common to all foods */ } 

interface Fruit extends Food, Record<Taste, boolean> {
    color: string;
}

如果 Record<Taste, boolean> 的某个属性与 Food 上的属性发生冲突(即它们的类型不兼容),TS 会在编译时给出类型错误。

如果你不想要求所有的 Taste 属性都存在,你可以让 Fruit 实现 Partial<Record<Taste, boolean>>。