如何在TypeScript中从键入的对象中动态删除键

时间:2020-08-15 17:43:01

标签: typescript

如何动态地从键入的对象中删除键?

例如,我的界面QUERY_PARAMS是:

export interface QUERY_PARAMS {
  query: string;
  min_height?: string;
  max_height?: string;
  min_width?: string;
  max_width?: string;
  color?: string;
  image_type?: IMAGETYPE;
  order?: ORDER;
  orientation?: ORIENTATION;
}

我的尝试动态删除密钥的代码:

  async getAllImages(inputParams: QUERY_PARAMS) {
     for (let key in inputParams) {
       if (!inputParams[key]) {
         delete inputParams[key]
       }
     }
     // ...
  }

它引发错误:

element隐式地具有“ any”类型,因为类型“ string”的表达式不能用于索引类型“ QUERY_PARAMS”。 在类型“ QUERY_PARAMS”上找不到参数类型为“字符串”的索引签名

1 个答案:

答案 0 :(得分:1)

该错误是因为key是一个字符串,不够具体,无法作为inputParams(即keyof QUERY_PARAMS)的属性。当前,TS不允许您为for循环(issue#3500)的迭代变量定义类型,但是您可以对循环内的键进行类型声明:

export interface QUERY_PARAMS {
  query: string;
  min_height?: string;
  // ...
}

async function getAllImages(inputParams: QUERY_PARAMS) {
  for (let key in inputParams) {
    const k = key as keyof QUERY_PARAMS; // <-- type assertion
    if (!inputParams[k]) {
      delete inputParams[k]
    }
  }

  // ...
}

const p: QUERY_PARAMS = {
  query: 's',
  min_height: undefined,
}

console.log(p); // { query: 's', min_height: undefined }

getAllImages(p);

console.log(p); // { query: 's' }