如何动态地从键入的对象中删除键?
例如,我的界面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”上找不到参数类型为“字符串”的索引签名
答案 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' }