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

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

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

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

Q&A

解決済

1回答

1038閲覧

型変換後にタプル型の変数に格納する方法

t_t_t

総合スコア1

TypeScript

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

0グッド

0クリップ

投稿2020/09/12 16:48

前提・実現したいこと

型変換した変数をタプル型の変数に単純に入れるとエラーが発生します。
具体的にはnumber型で受け取った値を計算したのち、string型に変換してタプル型の変数に入れたいです。

発生している問題・エラーメッセージ

Type 'string' is not assignable to type '"1" | "2" | "3" | "4"'.

該当のソースコード

ts

1type TestProps = { 2 testProp: '1' | '2' | '3' | '4'; 3} 4 5const value = 0; 6const castValue = String(value + 1); 7 8const TestObject: TestProps = { 9 testProp: castValue 10}

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

Typescript 4.0.2

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

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

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

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

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

jun68ykt

2020/09/13 01:06 編集

value を何らか型づけすることは可能でしょうか?言い換えると、value は、整数値の 0, 1, 2, 3 しか取りえないと考えてよいのか? それとも、number のあらゆる値(たとえば 100 だったり、0.1 など)を取り得ることがあるのか? これについて補足いただけると、回答がつきやすいかもしれません。
Hogeike

2020/09/14 04:19

もう少し直接的な質問にした方が良いと思います。質問の意図が不明です。 本当にあなたがやりたいことを質問したほうが、これを解決する直接的な方法を考えるよりもより良い解決策が提供される可能性があります。
guest

回答1

0

ベストアンサー

人間が考えれば value が 0 なので castValue の中身が文字列の '1' になることはわかりますが,typescript のコンパイラは value は number 型として認識しているので, number型に + 1 した結果がnumber 型の何かしらの値であることは分かっても実際の計算結果が何になるのか(この例ですと1ですね)を知ることはできません.

そのため計算結果によって得られた number 型のなにがしを String にかけたものを代入しているので castValue を string型として扱う.がコンパイラの限界となります.

このような場合 castValue の結果を '1' | '2' | '3' | '4' のどれかであるかをコンパイラに伝えるためにはタイプガードを実装することで実現できます.

typescript

1const testPropsValues = ['1', '2', '3', '4'] as const; 2 3type TestProps = { 4 testProp: (typeof testPropsValues)[number] 5} 6 7// タイプガード 8const isTestPropValues = (arg: string): arg is TestProps['testProp'] => (testPropsValues as Readonly<string[]>).includes(arg); 9 10const value = 0; 11const castValue = String(value + 1); 12 13const TestObject: TestProps = { 14 // castValue が 1, 2, 3, 4以外の場合のことも考慮しないといけないことに注意 15 testProp: isTestPropValues(castValue) ? castValue : '1', 16} 17

投稿2020/09/16 10:20

編集2020/09/16 10:21
Yama-Tomo

総合スコア49

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

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

t_t_t

2020/09/21 00:22

タイプガードの使い方がわかっておらず、少し理解できました。こちらで想定の挙動にできました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問