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

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

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

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

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

TypeScript

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1284閲覧

TypeScript (JavaScript)での配列型のチェック方法

0819Goki

総合スコア24

JavaScript

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

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

TypeScript

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/11/03 21:33

前提・実現したいこと

TypeScriptで、複素行列クラスを実装しております。
コンストラクタの実装でvaluesがComplex[]とnumber[]の場合で、instanceofを使って場合分けし、それぞれの場合で処理したいのですが、うまくいきません。
どのように実装すれば良いのでしょうか。

該当のソースコード

TypeScript

1class Matrix{ 2 m:number; 3 n:number; 4 values:Complex[]; 5 constructor(m:number, n:number); 6 constructor(m:number, n:number, values?:number[]|Complex[]){ 7 this.m=m; 8 this.n=n; 9 if(values == undefined){ 10 this.values=Complex.zeros(m*n); 11 }else if(Array.isArray(values)){ 12 if(values instanceof Complex[]){//ここで困ってます。 13 this.values=values; 14 }else{ 15 this.values=Complex.zeros(m*n); 16 for(let i=0;i<values.length;i++){ 17 this.values[i]=this.values[i].add(values[i]); 18 } 19 } 20 } 21 } 22}

試したこと

values instanceof Complex[]では、そもそも構文エラーで、
values[0] instanceof Complexでは、valuesがComplex[]であることが確定しておらず、this.values=valuesで代入できない。
typeof(values) === "Complex[]"もダメでした。

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

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

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

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

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

guest

回答1

0

ベストアンサー

type predicate を使って、以下のような関数

typescript

1function isComplexArray(values: number[] | Complex[]): values is Complex[] { 2 return values[0] instanceof Complex; 3}

を作っておき、以下のように修正すると、どうでしょう?

diff

1- if(values instanceof Complex[]){//ここで困ってます。 2+ if (isComplexArray(values)) {

ちなみに、以下をTypescript Playground (v4.4.4) にコピペしてもエラーは無かったです。(Complex クラスは当方の推測でテキトーに作りました。)

typescript

1class Complex { 2 real = 0; 3 imaginary = 0; 4 5 static zeros(size: number) { 6 return [...Array(size)].map(_ => new Complex()); 7 } 8 9 add(other: Complex | number) { 10 if (other instanceof Complex) { 11 this.real += other.real; 12 this.imaginary += other.imaginary; 13 } else { 14 this.real += other; 15 } 16 return this; 17 } 18} 19 20function isComplexArray(values: number[] | Complex[]): values is Complex[] { 21 return values[0] instanceof Complex; 22} 23 24class Matrix { 25 m: number; 26 n: number; 27 values: Complex[] = []; 28 29 constructor(m: number, n: number, values?: number[] | Complex[]) { 30 this.m = m; 31 this.n = n; 32 33 if (values == undefined) { 34 this.values = Complex.zeros(m * n); 35 } else if (Array.isArray(values)) { 36 if (isComplexArray(values)) { 37 this.values = values; 38 } else { 39 this.values = Complex.zeros(m * n); 40 for (let i = 0; i < values.length; i++) { 41 this.values[i] = this.values[i].add(values[i]); 42 } 43 } 44 } 45 } 46} 47

投稿2021/11/03 23:45

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0819Goki

2021/11/04 08:25

なるほど、 type predicate という方法を初めて知りました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問