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

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

新規登録して質問してみよう
ただいま回答率
85.48%
インターフェース

インターフェイスという用語はハードウェア・ソフトウェアの両方に使うことができます。 一般的に、インターフェイスは内部処理の詳細を見せないように設定されます。オブジェクト指向プログラミングにおいて、インターフェイスはabstractクラスとして定義されます。

TypeScript

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

Q&A

解決済

1回答

1945閲覧

あるインターフェース型の変数を動的に初期化したい

退会済みユーザー

退会済みユーザー

総合スコア0

インターフェース

インターフェイスという用語はハードウェア・ソフトウェアの両方に使うことができます。 一般的に、インターフェイスは内部処理の詳細を見せないように設定されます。オブジェクト指向プログラミングにおいて、インターフェイスはabstractクラスとして定義されます。

TypeScript

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

0グッド

0クリップ

投稿2021/08/26 18:22

前提・実現したいこと

TypeScriptにおいて,あるインターフェース型の変数を動的に初期化したいです.

例えば,StudentScoreというインターフェースがあるとします.

TypeScript

1export interface StudentsScore { 2 A: number; 3 B: number; 4 // ... 省略 5 Z: number; 6}

そして,StudentScore型の変数studentScoreを作り,そのプロパティを動的に0で初期化したいと考えています.

TypeScript

1import { keys } from "ts-transformer-keys"; 2 3const studentNames = keys<StudentScore>();// 生徒の名前が入った配列["A", "B", ..., "Z"] 4const studentsScore: StudentsScore = {};// 各生徒の成績 5 6// 各生徒の成績を0点で初期化する 7for(const studentName of studentNames) { 8 studentsScore[studentName] = 0; 9}

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

const studentsScore: StudentsScore = {};// 各生徒の成績において,次のエラーが発生しました.

Error

1型 '{}' には 型 'StudentsScore' からの次のプロパティがありません: A, B, C, D、22 など。ts(2740)

試したこと

const studentsScore: StudentsScore = {};// 各生徒の成績をコメントアウトしてみましたが,ページのコンソール上で次のエラーが発生します.

Error

1Uncaught TypeError: Cannot set property 'A' of undefined

また,次のソースコードのように全プロパティを静的に初期化すればエラーを吐きませんが,スマートではないので使いたくありません.

TypeScript

1const studentScore: StudentScore = { 2 A: 0, 3 B: 0, 4 C: 0, 5 D: 0, 6 E: 0, 7 // ... 8};

どうすれば生徒の成績を動的に初期化することができますか?

実行環境

  • typesciprt 4.3.5

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

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

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

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

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

guest

回答1

0

ベストアンサー

キャストは必要ですが、Object.fromEntriesで作ってしまってはどうでしょうか?

typescript

1const studentsScore = Object.fromEntries( 2 studentNames.map(key => [key, 0]) 3) as StudentsScore;

投稿2021/08/26 22:42

maisumakun

総合スコア145183

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

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

退会済みユーザー

退会済みユーザー

2021/08/27 15:34

ご回答ありがとうございます. ご提示いただいた方法で解決することができました. キャスト時に次のようなエラーが発生しましたが,Str<number>型を継承したStudentScore型にすることによってエラーは無くなりました. ```Error 型 '{ [k: string]: number; }' から型 'StudentsScore' への変換は、互いに十分に重複できないため間違っている可能性があります。意図的にそうする場合は、まず式を 'unknown' に変換してください。 型 '{ [k: string]: number; }' には 型 'StudentsScore' からの次のプロパティがありません: A, B, C, D、22 など。ts(2352) ``` ```TypeScript interface Str<T> { [key: string]: T; } interface StudentsScore extends Str<number> { A: number; B: number; // ... 省略 Z: number; }; ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問