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]
}
}
// ...
}
오류가 발생합니다.
'문자열'유형의 표현식은 'QUERY_PARAMS'유형을 색인화하는 데 사용할 수 없기 때문에 요소에 암시 적으로 '모든'유형이 있습니다. 'QUERY_PARAMS'유형에 'string'유형의 매개 변수가있는 색인 서명이 없습니다.
답변
1 bsapaka
오류는 , 즉 key
의 속성이 될만큼 구체적이지 않은 문자열 이기 때문 입니다 . 현재 TS에서는 루프 ( issue # 3500 ) 의 반복 변수에 대한 유형을 정의 할 수 없지만 루프 내부의 키에 대해 유형 어설 션을 수행 할 수 있습니다.inputParams
keyof QUERY_PARAMS
for
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' }