eoao
@eoao

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

undifinedを引数の型に記載しなくても使用できるようになる方法

解決したいこと

TypeScriptの引数に渡す値を設定したところ以下のエラーが出てしまいます。
受け取り側のメソッドの引数の型にundefinedを足せばよいことはわかるのですが、
undifinedを足さなくても使用できるようになる方法はないでしょうか。

例で挙げているコードが簡素で申し訳ないのですが、実際の処理上はvalidation.check()に値が設定されているときには
menberInfoおよびidには必ず値が入っている状態です。
上記で書いた方法以外に、直前にifでundifinedではない趣旨のチェックをすることでもエラーは消えますが
処理上は必ず値があることは担保されているため、なるべくやりたくないです。

型 'MenberId | undefined' の引数を型 'string' のパラメーターに割り当てることはできません。
  型 'undefined' を型 'string' に割り当てることはできません。ts(2345)

該当するソースコード

  private menberInfo?: MenberInfo;

  go() {
    validation.check(this.menberInfo?.id.id)

  }
}

export class validation {

  static check(name: string): boolean {
    return true
  }
}

interface MenberInfo {

  name: MenberName;

  id: MenberId;

}

interface MenberName {

  name: string;

}

interface MenberId {

  id: string;

}


0

3Answer

 これ、MemberId.idが初期化されていないからundefinedになっているのでは
 それにインターフェイスは主にクラスに継承して、そのクラス内で実装すべきことを定義するものなので、interfaceではなくclassの方を使った方が良いです

0Like

1行目の

private menberInfo?: MenberInfo;

でオプショナルプロパティなのでmemberInfoがundefinedの可能性ありになってます。この?を外せないですか?

外せないなら自身でおっしゃるように直前にifでタイプガードするものかと。
もしくは「処理上は必ず値があることは担保されている」のであればそのタイミングでvalidateするとか。

最悪、

validation.check(this.menberInfo?.id.id as any)

でも回避できると思いますが...

0Like

式の後ろに ! をつけることで、式の型から null と undefined を除外することができます。以下のように書いてください。

validation.check(this.menberInfo?.id.id!)

TypeScript の型システムに共通して言えることですが、実行時には型チェックが行われないので、実行中に式が undefined になっても検出はできません。担保を確実にして慎重に使ってください。

0Like

Your answer might help someone💌