TypeScript で便利だった構文

TypeScript を書いていると、思わぬところで型周りであったりエラーになったりする。
JavaScript ならば特に気にもしないポイントで。

というわけで、見つけた便利な書き方をメモしておきたい。

随時更新していく。

オブジェクトのキーでループ

1
2
3
4
5
6
7
const params = {a:"AA",b:"BB"};

(Object.keys(params) as (keyof typeof params)[])
.forEach((key) => console.log(`${key}=${params[key]}`))
// => a=AA
// b=BB

任意の文字列キーを持つ型

1
2
3
4
5
6
7
export interface ObjectOfStringKey {
[key: string]: string;
}

export interface ObjectOfStringKeyAnyValue {
[key: string]: any;
}

任意のプロパティを除外する

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
export const selectObject = <T>(
srcObject: T,
requestProperties: (keyof T)[],
): Omit<T, keyof T> => {
let result: Omit<T, keyof T> = Object.assign({}, srcObject);
const removeProperties = <(keyof T)[]> (
Object.keys(srcObject).filter(
(key: string) => !requestProperties.includes(<keyof T> key),
)
);

removeProperties.forEach((key: keyof T) => {
const { [key]: _, ...tmp } = result;
result = tmp;
});

return result;
};

後にサバイバルTypeScript - オブジェクトのサブセットを得るを見つけた。

分割代入で十分解決できるので、ここまでやらなくても済む。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
interface DataA {
a: string;
b: string;
c: string;
}

type DataB = Omit<DataA, "a">;

function dataAToDataB(param: DataA): DataB {
const p = (({ a: _, ...p }) => p)(param); // a のままだとリンターから指摘が入るので _ にしておく
return p;
}

const param = { a: "A", b: "B", c: "C" };

console.log(dataAToDataB(param));
// => { b: "B", c: "C" }


複数のプロパティを落とす場合、次の通りでもよい。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
interface DataA {
a: string;
b: string;
c: string;
}

type DataB = Omit<DataA, "a" | "b">; // type DataB = Pick<DataA, "c">; でもよい

function dataAToDataB(param: DataA): DataB {
const p = (({ a: _a, b: _b, ...p }) => p)(param);
return p;
}

const param = { a: "A", b: "B", c: "C" };

console.log(dataAToDataB(param));

// => { c: "C" }