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

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

新規登録して質問してみよう
ただいま回答率
85.40%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

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

Q&A

解決済

2回答

324閲覧

TypeScriptのRecordに警告を表示したい

natural2

総合スコア13

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

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

0グッド

2クリップ

投稿2024/07/02 10:06

編集2024/07/02 10:19

実現したいこと

TypeScriptのRecordに警告を表示したい

前提

以下のようなソースコードの場合、インデックス100は範囲外なので、userNameにundefinedが代入されるはずです。

typescript

1const users: Record<number, string> = { 2 0: 'takahashi', 3 1: 'yamada', 4 2: 'tanaka' 5} 6 7// userNameの型は string | undefined を期待しているが、stringになっている 8const userName = users[100] 9const lowerCaseUserName = userName.toLowerCase()

しかし、コードを書いているときはこのような問題に気づけません。
また、そもそもuserName変数はstring | undefinedではなく、stringになっています。

強制的にstring | undefined にしたり、VSCodeで編集中に気付けるように警告を表示させることは可能でしょうか。

型がstring | undefinedであれば以下のようなエラーが表示され、編集中に気づけるようになり、安全なコードが書けるようになります。

typescript

1const userName = users[100] 2const lowerCaseUserName = userName.toLowerCase() 3// 'userName' は 'undefined' の可能性があります。 ts(18048)

試したこと

  • 以下のように書く事で期待するような事が出来るのですが、Recordの型を変更するのは違うと思っています。keyが見つからずにundefinedになる事と、valueにundefinedが含まれている事は違うと思います。

typescript

1const users: Record<number, string | undefined> = { 2 0: 'takahashi', 3 1: 'yamada', 4 2: 'tanaka' 5}

補足情報(FW/ツールのバージョンなど)

  • TypeScript 5.5.2

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

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

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

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

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

guest

回答2

0

自己解決

tsconfig.json で以下を指定する事で実現できました。
strictnoUncheckedIndexedAccessどちらも指定する必要があります。
片方だけではダメでした。

tsconfig.json

1{ 2 "compilerOptions": { 3 "strict": true, 4 "noUncheckedIndexedAccess": true, 5 } 6}

投稿2024/07/02 12:37

編集2024/07/02 12:44
natural2

総合スコア13

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

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

0

以下のように書く事で期待するような事が出来るのですが、Recordの型を変更するのは違うと思っています。

逆に、Record<0 | 1 | 2, string>型にする、あるいは(データを書き換えないなら)as constとしてキーを決め打ちにする、というような手段は取れませんでしょうか。

投稿2024/07/02 11:51

maisumakun

総合スコア145628

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

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

natural2

2024/07/02 12:38 編集

回答有り難うございます。 今回、keyは数値で0~nです。nは不定なので不可能です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.40%

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

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

質問する

関連した質問