

# 発生している問題

TypeScriptで抽象クラスが利用できません。  
`変数 'person' は割り当てられる前に使用されています。`と表示されます。

試した事2の方法で実行できる状態になりましたが、もっと良い方法を探しています。

[![](https://i.stack.imgur.com/CiHXV.png)](https://i.stack.imgur.com/CiHXV.png)

# 再現手順

  1. 初期化する

[code]

    npm init -y
    npm install typescript ts-node
    
[/code]

  2. package.jsonに`start`を追加する

[code]

    "scripts": {
      "start": "ts-node src/index.ts"
    }
    
[/code]

  3. プログラムを書く

[code]

    import fs from 'fs'
    
    abstract class PersonBase {
      abstract sayGender(): void;
    }
    
    class FemalePerson extends PersonBase {
      sayGender() {
        console.log('female')
      }
    }
    
    class MalePerson extends PersonBase {
      sayGender() {
        console.log('male')
      }
    }
    
    const str = fs.readFileSync('person.txt', { encoding: 'utf-8' })
    console.log(str)
    
    // ファイルの内容によって利用するクラスを変更したい
    let person: PersonBase
    if (str === 'male') {
      person = new MalePerson()
    } else if (str === 'female') {
      person = new FemalePerson()
    }
    
    if (person !== null) {
      person.sayGender()
    }
    
[/code]

  4. 実行する

[code]

    npm run start
    
[/code]

# 試した事

  1. 未割り当て状態を無くすためにnullを代入した。  
しかし、`型 'null' を 型 'PersonBase' に割り当てることはできません。 ts(2322)`というエラーが表示されました。

[code]

    let person: PersonBase = null
    
[/code]

  2. ダミークラスを作成した。  
問題なく実行できる状態になりました。しかし、無駄なクラスを作る必要があるのでもっと良いやり方があるのではと思いますが、私は見つけることが出来ませんでした。

[code]

    class DummyPerson extends PersonBase {
      sayGender() {}
    }
    
    let person: PersonBase = new DummyPerson()
    
[/code]


CC BY-SA 4.0
2022-09-10T07:02:54.067
91026
2022-09-11T04:00:13.153
2022-09-10T07:11:48.327
34546
34546
question
node.js typescript
TypeScriptで抽象クラスを利用したい


personをnull代入可能として宣言する事で解決しました

[code]

    let person: PersonBase | null = null
    
[/code]


CC BY-SA 4.0
2022-09-10T16:00:43.007
91032
2022-09-10T16:00:43.007
34546
91026
answer


すでに自己解決されたようですが、当初の`変数 'person'
は割り当てられる前に使用されています。`というエラーは、条件分岐に『`str`が'male'でも'female'でもなかった場合』にpersonに値が代入されないことを検知してアラートされたものと思われます。  
具体的には、

[code]

    else{
      person = ... ;
    }
    
[/code]

という記述が足りないと言うことです。

自己解決された書き方でも動きはします。しかし、元のコードでは代入を条件分岐でひとかたまりにされていたので、else文を使った方が可読性やメンテナンスのしやすさは上がるのではないでしょうか。

[code]

    let person: PersonBase|null;
    
    if (str === 'male') {
      person = new MalePerson()
    } else if (str === 'female') {
      person = new FemalePerson()
    }else{
      person = null;
    }
    
[/code]


CC BY-SA 4.0
2022-09-11T04:00:13.153
91036
2022-09-11T04:00:13.153
52932
91026
answer