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

时间:2019-07-10 09:38:59

标签: typescript types typescript-typings

已编辑:更改ID类型

我有一个具有以下值的数组

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

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

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

我尝试使用查找类型,但未成功…

有什么想法吗?

致谢

2 个答案:

答案 0 :(得分: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
};

答案 1 :(得分:0)

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

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']);