optional?の使用を避ける
optional?: ..を使うと、値と型で矛盾が生じるケースがある
「propertyの存在」の意味が変わるから
問題
objectの具体的な形にアクセスすると矛盾が生じるに書いているような問題が生じる
例えば、propertyが増える方向への暗黙のcast
code:2.ts
const x: { a: number; b: boolean } = { a: 42, b: true };
const y: { a: number } = x; // propteryが減る方向へのcastなのでok
// optional?の場合は、proprtyが増える方向へのcastがokになる
const z: { a: number; b?: string } = y;
// 矛盾が生じる.
// bの型: string | undefined
// bの値: true
const b = z.b;
対策
そもそもoptional?を使わないようにする
これは、1.tsにも2.tsにも効果がある
optionalにしたい時は、hoge: string | undefinedのように、
?を使わずに、undefinedとのunion型で指定すれば良い
参考
exactOptionalPropertyTypes によせて - Object.create(null)
?の何が危険か?
?を使うならこのケースぐらいじゃないか?の提案(2つ)