【问题标题】:Describe interface Fixed values ​in Array element of TypeScript在 TypeScript 的 Array 元素中描述接口 Fixed values
【发布时间】:2020-09-03 03:42:08
【问题描述】:

我正在尝试使用 TypeScript 来描述对象的接口。面临这样一个问题:如何借助一个接口设置机会,数组中的限定值。示例:

export interface IChannel {
  title: string
  name: string,
  signal: ["discrete", "analog", "text"] | ["discrete", "analog"] | ["discrete"] | ["analog"] | ["text"] | ["analog", "text"], // OMG... IT"S BAD !!!
  enabled: boolean
  "description": string,
  "isChangeVisibility": boolean
}

需要提交signal = ["离散" OR/AND "模拟" OR/AND "文本"] 此字段必须仅包含这些值。数组长度(可能是 1、2 或 3 个元素) 谢谢你的帮助。我会坐下来做实验。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    使用像@axiac 建议的枚举是一种解决方案,但是如果你想创建一个IChannel 类型的对象,你必须使用枚举值(例如你不能做signal: ['discrete'],它必须是@987654322 @ 或 signal: ['discrete'] as SignalType[])。

    IMO 文字类型的联合更简单,不会产生任何额外的 JavaScript 输出(枚举被编译为对象):

    type SignalType = 'discrete' | 'analog' | 'text';
    
    export interface IChannel {
      title: string;
      name: string;
      signal: SignalType[];
      enabled: boolean;
      description: string;
      isChangeVisibility: boolean;
    }
    

    缺点是像['discrete', 'discrete'] 这样的东西对于编译器来说是可以的。如果强制执行值的唯一性很重要,那么我认为您当前的解决方案是唯一合理的解决方案。

    您也可以使用signal: [SignalType, SignalType?, SignalType?],它将元素的数量强制为 1、2 或 3(但仍然不能解决值唯一性的问题)。

    【讨论】:

    • 谢谢@paolostyle。这很好用。以牺牲唯一性为代价并不重要。它是编译器的理想选择。
    【解决方案2】:

    enum 是可以在字段signal 中使用的值的最佳类型:

    enum SignalType {
      discrete = 'discrete',
      analog = 'analog',
      text = 'text',
    }
    
    export interface IChannel {
      title: string
      name: string,
      signal: SignalType[]
      enabled: boolean
      description: string,
      isChangeVisibility: boolean
    }
    

    【讨论】:

    • 但这并不限制重复键的可能性 (?..
    • @VRoxa 它没有,但是除了 OP 已经拥有的之外,没有其他任何好的方法可以实现它,stackoverflow.com/a/57021889/1708094 可以帮助,但 IMO 不值得努力
    • 另一种选择是将signal 设为数字字段,并使用与按位OR 运算符组合的数值。这有优点(定义中的重复值无关紧要)和缺点(类型接受无效值,操作对新手来说有点神秘)。
    猜你喜欢
    • 2016-03-24
    • 2017-08-08
    • 2018-08-19
    • 2019-04-06
    • 1970-01-01
    • 2022-01-23
    • 2019-02-04
    • 1970-01-01
    • 2016-08-09
    相关资源
    最近更新 更多