Cách loại bỏ các khóa khỏi một đối tượng có kiểu trong TypeScript một cách động
Làm thế nào để tôi có thể xóa các khóa khỏi một đối tượng đã được kiểu hóa một cách động?
Ví dụ, giao diện của tôi QUERY_PARAMS là:
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 để thử xóa các khóa một cách động:
async getAllImages(inputParams: QUERY_PARAMS) {
for (let key in inputParams) {
if (!inputParams[key]) {
delete inputParams[key]
}
}
// ...
}
Nó gây ra lỗi:
phần tử ngầm định có kiểu 'any' vì biểu thức có kiểu 'string' không thể được sử dụng để lập chỉ mục kiểu 'QUERY_PARAMS'. Không tìm thấy chữ ký chỉ mục với tham số kiểu 'string' trên kiểu 'QUERY_PARAMS'
Câu trả lời #1
Lỗi xảy ra vì key là một chuỗi, điều này không đủ cụ thể để trở thành 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 định nghĩa kiểu cho biến lặp của một vòng for (issue#3500), nhưng bạn có thể thực hiện một phép khẳng định kiểu trên key 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' }
