【问题标题】:Mixed type index signature with an optional specific value具有可选特定值的混合类型索引签名
【发布时间】:2020-09-06 05:08:27
【问题描述】:

我有一个对象,它存储与其他对象相关的值,以它们的数字 id 为键。

const values = {
  1: 0.5, // id 1
  2: 0.8, // id 2
}

但是还有一个特殊的异常键,字符串 id 为 'all',所以对象可能如下所示:

const values = {
  'all': 0.3,
  1: 0.5,
  2: 0.8,
}

我已经创建了type ObjectId = number | 'all',它可以很好地在我的应用程序中传递混合类型 ID,但在键入上述值对象的索引签名中却无法正常工作。如果我按照我在其他地方看到的混合类型索引签名:

type ObjectId = number | 'all';

interface Values {
  [id in ObjectId]: number;
}

编译成

interface Values {
  [id: number]: number;
  'all': number;
}

这使得'all' 属性是必需的,所以像我的第一个示例这样的对象会引发类型错误。

如何为这个对象编写一个接口,将键限制为numbers or the string 'all' 而无需做任何事情?

【问题讨论】:

    标签: typescript


    【解决方案1】:
    interface Values {
      [id: number]: number;
      'all'?: number;
    }
    
    function foo(value: Values) {}
    
    foo({
      1: 1,
    });
    foo({
      all: 1,
    });
    foo({
      1: 1,
      all: 1,
      other: 2, // will raise an error
    });
    
    

    使all 可选?

    【讨论】:

    • 这会导致一个新的、不同类型的错误。在我的对象被访问的地方需要一个number 值,它现在正在接收number | undefined,因为如果它使用ObjectId 类型的键访问值,它可能正在查看all 键,如果all 是可选的,它可以是未定义的。
    猜你喜欢
    • 2020-07-12
    • 1970-01-01
    • 2020-12-24
    • 2015-11-05
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    相关资源
    最近更新 更多