項目43 可能なかぎり狭いスコープでany型を使う
やむを得ず、anyを使わざる得ない時は、そのスコープをできる限り狭くし、コードの他の部分で型安全性が損なわれないようにする
良くないパターン
code:ts
declare function getPizza(): Pizza;
function eatSalad(salad: Salad) { /* ... */ }
const pizza: any = getPizza;
eatSalad(pizza);
良いパターン
部分的にpizzaをany型として扱う
code:ts
declare function getPizza(): Pizza;
function eatSalad(salad: Salad) { /* ... */ }
const pizza = getPizza;
eatSalad(pizza as any);
関数からany型は決して返さないようにする。その関数を呼び出すことで型安全性が失われるため
code:ts
function eatDinner1() {
const pizza: any = getPizza();
eatSalad(pizza);
pizza.slice();
return pizza; // 戻り値の型がanyになる
}
function spiceItUp() {
const pizza = eatDinner1();
// ^? const pizza: any
pizza.addRedPepperFlakes();
}
標準ライブラリにはany型を返すものがいくつかあるので気をつける
Json.parseなど
anyを使うのではなく、アノテーションコメントを使って対応する方法ある
多用厳禁
code:ts
function eatDinner1() {
const pizza = getPizza();
// @ts-ignore
eatSalad(pizza);
pizza.slice();
}
code:ts
function eatDinner2() {
const pizza = getPizza();
// @ts-expect-error
eatSalad(pizza);
pizza.slice();
}
オブジェクト全体ではなく、部分的なプロパティのみ型エラーを解消したい場合はas anyを使用する
code:ts
const config: Config = {
a: 1,
b: 2, // これらのプロパティは依然としてチェックされる
c: {
key: value as any
}
};