質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

1回答

5832閲覧

Undifinedの可能性がある値の適切な使用方法

yuki_90453

総合スコア326

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

2クリップ

投稿2019/12/20 08:57

TypeScriptにおいて、strictPropertyInitializationをtrueにしていると値がUndifinedである可能性を含むようになるかと思います。

process.env.NODE_ENV // string | undifined process.env.NODE_ENV.length // Undifinedである可能性があります。

###試したこと
コードを書く上で、値の中身がstringである確証があっても「Undifined可能性がある」という理由でコードが通りません。
迂回方法と2つ方法を取っております。
① 事前に定義した変数へ代入する

let node_env:string; if(typeof process.env.NODE_ENV === ’string’){ node_env = process.env.NODE_ENV; } node_env.length // 文字数が出力

②「!.」を使用する。

process.env.NODE_ENV!.length // 文字数出力

その他、「キャストさせる」や「strictチェックを解除する」方法がありますがアンチパターンだと聞きますので除きました。

###質問
Undifinedの可能性がある値の適切の扱い方はどういった方法なんでしょうか?
私が記述しました、
①の方法はコードが冗長になりあまり良い書き方ではないと思います。
②の方法、ネットでチラ見してから使うようになりましたが、tsconfigでstrictチェックしないように設定していると変わらないような気がします。

コードを書く上で使用する値のほとんどがUndifinedの可能性を含んでおり、早めに理想の書き方を思い質問させて頂きました。
何卒よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

僕でしたらNullish CoalescingとOptional Chainingを使います
結論から言うと

typescript

1const x = HOGE.bar?.length ?? 1

これでxはnumber型に推論されます、とても嬉しいですね。

Playground

何をやっているかと言うと、まずHOGE.bar?.lengthについて、HOGE.barがstringの時(=null,undefinedでない時)はHOGE.bar.lengthを、undefined(かnull)の時はlengthまでアクセスしようとせず、その場でHOGE.barを(つまりundefinedを)返してくれます。
これがOptional Chainingです。

そしてHOGE.bar?.length によってnumber値かundefinedが返されるようになるわけですが、後ろの ?? 1によってこれがundefined(かnull)を返していた時、デフォルト値として1を返すようにしています。
これがNullish Coalescingです。

undefinedかnullを返しうる値を扱う時は、僕はこう言う風にデフォルト値を与えて処理しています(突き詰めるとケースバイケースに至りそうですが)

ちなみにこの二つの機能はtypescript@v3.7から追加されたモダンなものなので、実プロダクトで使う時はtypescriptのupdateをしましょう

(といっても僕はts歴が浅く(プログラミング歴自体も浅い)もっといい方法があるかもしれませんが。。)

投稿2019/12/20 10:44

shinyaigeek

総合スコア112

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki_90453

2019/12/21 06:30

大変参考になりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問