typescript - 如何从 TypeScript 中的类型化对象中动态删除键

标签 typescript

如何从类型对象中动态删除键?

例如,我的接口(interface)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 implicitly has an 'any' type because expression of type 'string' can't be used to index type 'QUERY_PARAMS'. No index signature with a parameter of type 'string' was found on type 'QUERY_PARAMS'

最佳答案

该错误是因为 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' }

关于typescript - 如何从 TypeScript 中的类型化对象中动态删除键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63429072/

相关文章:

ios - 角标(Badge)数量始终为1(云函数)

javascript - AWS s3重定向到另一个s3存储桶

TypeScript 努力应对字符串文字的简单类型推断

javascript - 从文档中获取 HtmlElement

javascript - 如何在每次 ng 服务构建后链接 npm 脚本调用?

typescript - 当包含共享外部模块时,将多个 typescript 文件合并为一个 js 文件

Angular 2+ 从其父组件调用子组件中的函数

javascript - 类型 'checked' 上不存在属性 'HTMLElement'。

javascript - 上传前如何分割数据?

typescript - 启用 Visual Studio Code 以从 Typescript 类生成构造函数