打字稿,将键限制为数组元素

Posted

技术标签:

【中文标题】打字稿,将键限制为数组元素【英文标题】:Typescript, restrict keys to array elements 【发布时间】:2019-11-19 21:51:30 【问题描述】:

已编辑:更改 ID 类型

我有一个包含以下值的数组

const ids: number[] = [45, 56];

const obj: any = 
  45: "HELLO",
  56: "WORLD",
;

我想输入我的对象的当前any 类型,以将其限制为我的ids 数组值。

我尝试了查找类型,但没有成功……

有什么想法吗?

问候

【问题讨论】:

顺便说一句,const ids: string[] = [45, 56]; 行是错误的; 4556 不是 strings。 【参考方案1】:

您可以使用Record 映射类型。您还需要使用const 断言来捕获数组元素的文字类型:

const ids = [45, 56] as const;

const obj: Record<typeof ids[number], string> = 
    45: "HELLO",
    56: "WORLD",
;
const obj2: Record<typeof ids[number], string> = 
    45: "HELLO",
    56: "WORLD",
    57: "WORLD",  // error
;

【讨论】:

哇!太棒了,我不知道 const 存在但它起作用了,据说这个数组是不可变的? @ScreamZ 是的,它使数组只读,并且作为此元组和文字类型的副作用被保留(您将ids 类型作为[45, 56] 而不是number[]【参考方案2】:

如果您需要创建一个函数,该函数返回一个可类型检查的对象,其键对应于数组:

function indexKeys<K extends string>(keys: readonly K[]) 
  type Result = Record<K, number>;

  const result: Result =  as Result;

  const length = keys;

  for (let i = 0; i < length; i++) 
    const k = keys[i];

    result[k] = i;
  

  return result;
;

这里类型检查器会抱怨:

// Property 'zz' does not exist on type 'Result'.
const aa, zz = indexKeys(['aa', 'bb']); 

【讨论】:

以上是关于打字稿,将键限制为数组元素的主要内容,如果未能解决你的问题,请参考以下文章

如何将方法的泛型类型限制为打字稿中的对象?

打字稿限制对象属性的计数

打字稿:`| 的含义[T]`-用于数组中元素成员资格的编译时检查的约束

打字稿条件类型内部类型

如何在打字稿接口/类型中将枚举值类型转换为数组?

如何覆盖打字稿中的属性?