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]
}
}
// ...
}
エラーをスローします:
タイプ「string」の式を使用してタイプ「QUERY_PARAMS」にインデックスを付けることはできないため、要素には暗黙的に「any」タイプがあります。タイプ「string」のパラメータを持つインデックス署名がタイプ「QUERY_PARAMS」で見つかりませんでした
回答
1 bsapaka
ため、エラーがある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' }