Cách xóa động các khóa khỏi một đối tượng đã nhập trong TypeScript

Aug 16 2020

Làm cách nào để xóa động các khóa khỏi một đối tượng đã nhập?

Ví dụ: giao diện của tôi QUERY_PARAMSlà:

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;
}

Mã của tôi để cố gắng xóa động các khóa:

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

Nó ném ra lỗi:

phần tử ngầm định có kiểu 'bất kỳ' vì không thể sử dụng biểu thức của kiểu 'chuỗi' để lập chỉ mục loại 'QUERY_PARAMS'. Không tìm thấy chữ ký chỉ mục có tham số kiểu 'chuỗi' trên loại 'QUERY_PARAMS'

Trả lời

1 bsapaka Aug 16 2020 at 01:16

Lỗi này là bởi vì keylà một chuỗi, mà không phải là đủ cụ thể để có một thuộc tính của inputParams, tức là keyof QUERY_PARAMS. Hiện tại TS không cho phép bạn xác định kiểu cho biến lặp của forvòng lặp (sự cố # 3500 ), nhưng bạn có thể thực hiện xác nhận kiểu trên khóa bên trong vòng lặp:

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' }