TypeScriptのno initializer and is not definitelyエラーの対処法

プロパティが初期化されていないエラー

TypeScriptを使用し始めると下記のようなコードで次のようなエラーに直面することがよくある。

class User {
  id: number
  name: string

  constructor(id: number, name: string) {
    Object.assign(this, {id, name})
  }
}

const user = new User(123, 'sato')
console.log(user)

Property 'id' has no initializer and is not definitely assigned in the constructor.

日本語に訳すと以下のようになる。

プロパティ 'id' に初期化子がなく、コンストラクターで明確に割り当てられていません。

TypeScriptプロパティ初期化エラーサンプル

このエラーは次の2つの方法で出さないようにすることができる。

プロパティに「| undefined」を追加する

プロパティに「| undefined」を追加して初期化することでエラーが表示されなくなる。

class User {
  id: number | undefined
  name: string | undefined

  constructor(id: number, name: string) {
    Object.assign(this, {id, name})
  }
}

const user = new User(123, 'sato')
console.log(user)

しかし、これだと毎回「| undefined」を追加しなくてはならなくて面倒なので、次項のtsconfig.jsonを修正してエラーを表示させない方法もよく利用される。

tsconfig.jsonに"strictPropertyInitialization": falseを追記

tsconfig.jsonに「"strictPropertyInitialization": false」を追記するとプロパティ初期化を厳格にチェックしなくなるためエラーが表示されなくなる。

ちなみにtsconfig.jsonが存在しない場合はプロパティ初期化のエラーは表示されないので、エラー表示を確認する場合はtsconfig.jsonを追加する必要がある。

npx tsc --initを実行すると簡単にtsconfig.jsonを追加できます。

※ typescriptを入れていない場合はインストールが必要。

npm i -D typescript
npx tsc --init