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

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

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

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

Q&A

1回答

261閲覧

TypeScriptのコンストラクタシグネチャについて

KAI

総合スコア9

TypeScript

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

0グッド

0クリップ

投稿2025/01/29 11:24

編集2025/01/29 11:31

実現したいこと

TypeScruptの理解を深めたいのですが、コンストラクチャシグネチャの概念がいまいち分かりません。

前提

該当のソースコードに例のコードを記載しているのですが、理解ができません。

私の理解を記載しますので、ずれてる箇所から修正して頂けますと助かります。

testはただのinterfaceであり二つの型を指定している。
①インスタンス化可能なコンストラクタ関数
②string指定のnameプロパティ
つまり
function test2(argument: addFunc)の記載ではtmp実行時に①と②の二つを引数として渡す必要がある。
引数argumentの中身は「コンストラクター関数」と「stringプロパティ」の二つというイメージです。

AIに聞いたところこの書き方は引数にインスタンス化可能なコンストラクターを取りその中にnameプロパティが必要とのことです。
interfaceの仕様として
「new」と記載された以降のプロパティはinterfaceの中に(型の条件として)格納されるのではなくnewと記載されたコンストラクタ関数の中に格納されるような感じです。
何故、instanceの中身が急に"コンストラクタ関数だけ"になるのかが不明です。
instance {
一つ目の型:string
二つ目の型:number
三つ目の型:number
}

というふうに何個もオブジェクトの型を設定できるはずのに
なんで「new」がくると以降のプロパティがinstanceではなくてnewで記載したコンストラクタ関数の中に行くのかが分かりません、。

何か勘違いをしている可能性がありますので、お優しいかた分かりやすく教えて頂けますと嬉しいです。
宜しくお願いします

該当のソースコード

interface test {
new(num1:number, num2:number):number
name: string
}
function test2(argument: test) {
let data = new argument(1,2)
}

typescript

試したこと

AIやネットの情報を確認

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

TakaiY

2025/01/29 11:52

> function test2(argument: addFunc)の記載ではtmp実行時に①と②の二つを引数として渡す必要がある。 この文章はコードと矛盾していて何を書いているのかわかりません。 > 何故、instanceの中身が急に"コンストラクタ関数だけ"になる これの意味もいまひとつわかりません。 いずれにしても、提示のコードはインターフェースの定義しかありませんが、そのインターフェースを実装するクラスの定義を書いてみたらわかるのではないかと想像します。 ちなみに、「該当のソースコード」のところは、```と```の**間に**コードを入れるとよみやすくなります。
utm.

2025/01/29 12:58

インタフェースは普通、実装のないクラスのようなもので、 プロパティやメソッド(また、それに付随する型情報)を定義します、 質問文を読んで型という概念をしっかり理解しているのかが少し疑問に思えます。 ちなみに、newがコンストラクタならnumberを返すのは変です
KAI

2025/01/30 01:19

ご回答ありがとうございます! 例で書いた内容が分かりにくかったので再度下記に分解して認識書きます。 ずれてる箇所から修正いただけると大変助かります。 ①interfaceは複数の型を指定する手段である。 例:(一例です。他の例のコードとは関係ありません。以降も例は同様) interface Test { name:string age:number } この場合は「string型のnameプロパティ」と「number型のageプロパティ」二つを指定しなくてはならない。となる 〜〜ここまではあっていると思います。 ②私が調べている感じですと、下記の記載ではinterface自体が関数型として定義され、「name: string」は関数のプロパティとして設定する必要がある。と出てきました。 interface Test{ (num1:number, num2:number):number name: string } 
この際のイメージ図は obj (関数オブジェクト) ├── (num1, num2) => num1 + num2 ← 関数 └── name: "AdditionFunction" ← プロパティ であるかと思います。 「関数」とプロパティは隣の位置にあり、特段nameプロパティが「関数」の下にあるイメージではありません(「関数」に格納されている訳ではない) 実例 const obj: Test = Object.assign( (num1: number, num2: number) => num1 + num2, { name: "objオブジェクトのnameプロパティ" } console.log(obj(2, 3));→何故objを直接実行できるのかが不明です。 ==不明箇所== console.log(obj.name);→objの中のnameプロパティにアクセスして実行できている →不明箇所はありますが、イメージとして「nameプロパティ」と「関数」はそれぞれobjという家の他の部屋に格納されているように感じます。 〜〜※恐らくこの辺りの理解ができていません。 ③上記までの内容で関数型にnewをつけた場合 interface Test{ new (num1:number, num2:number):number →「new」を追加 name: string } 先程までのイメージであれば、オブジェクトの中にそれぞれ独立した、型指定が二つある認識です。 型全体を定義すると、まず、オブジェクト型である。そして、コンストラクタ関数とnameプロパティの二つを指定 しかし、下記の説明を見つけましたが理解できませんでした。 〜〜new を使うと、その型はコンストラクタ関数として扱われ、インスタンスを生成することができます。〜〜 〜〜name プロパティは クラスやコンストラクタ関数自身のプロパティとして定義されます。〜〜 疑問1 「○○を使うと○○として扱われ」という基準については interfaceの仕様として、interfaceの中で"関数型の書き方"や"new を先頭につけた記載"を確認するとそれに対応したものに interface自体が扱いを変えるという意味でしょうか? interfaceは型を複数指定するオブジェクトのようなものという認識です。 オブジェクtの中に「コンストラクタ関数」と「nameプロパティ」を一つづつ記載してくださいというような指定。 ですので 〜name プロパティは クラスやコンストラクタ関数自身のプロパティとして定義されます〜 この解説の場合 オブジェクトはクラス/コンストラクタ関数になりました。つまり、インスタンス化できるものとその中にnameプロパティも入れて記載してください。というような指定だと考えましたが。何故「new」の指定をするとinterfaceの指定自体が上記のようになるのか分かりませんでした。 ネットにある記事やAIでの確認がほとんどですので、かなり検討違いな事を言っていると思いますが、途中までは認識あっているとも思います。 割と惜しいような気もするので、修正箇所から分かりやすい説明頂けますと幸いです。
TakaiY

2025/01/30 02:48

ここは、質問に対するコメントを書くところです。 コメントに対応して質問内容を補足/修正する場合は、質問そのものを編集したほうが読み易くなります。
TakaiY

2025/01/30 03:04

まず、interfaceは、他でも指摘されている通り、実体として使えませんので、あくまでinterfaceで議論したいのであれば、簡易なものでいいので、ぞれを実装したクラスは挟む必要があります。(前に指摘したとおり) また、どうやら、コンストラクタの理解についての質問のようなので、そもそもinterfaceを外して議論したほうがいいようにも思います。 > 下記の記載ではinterface自体が関数型として定義され、「name: string」は関数のプロパティとして設定する必要がある。と出てきました。 これはどこかに書かれているものですか? ソースは提示できますか?
utm.

2025/01/30 04:23

> 「○○を使うと○○として扱われ」という基準については interfaceの仕様として、interfaceの中で"関数型の書き方"や"new を先頭につけた記載"を確認するとそれに対応したものに interface自体が扱いを変えるという意味でしょうか? 前後関係が逆、 インターフェースを、継承したクラスがインタフェースと同じ型として振る舞える ※多分インタフェースはそもそも意味のある例を見ないと理解できない、その例は気が向いたら回答します、 > interfaceは型を複数指定するオブジェクトのようなものという認識です。 オブジェクtの中に「コンストラクタ関数」と「nameプロパティ」を一つづつ記載してくださいというような指定。 まずオブジェクトや関数という言葉を使うのをやめた方がいいのかもしれません、どちらもJavaScriptでは柔軟な意味を持ちますがこれが混乱をきたしていると思います、 このサイトでもTypeScriptの質問がありましたが、この混乱のおかげか知りませんが、ジェネリクスやカリー化についての質問で根本的な考え方がずれて、アプローチがおかしい問いを立てていた方がいました。 (オブジェクトや関数という概念と無関係に関わらず) > ですので 〜name プロパティは クラスやコンストラクタ関数自身のプロパティとして定義されます〜 この解説の場合 オブジェクトはクラス/コンストラクタ関数になりました。つまり、インスタンス化できるものとその中にnameプロパティも入れて記載してください。というような指定だと考えましたが。何故「new」の指定をするとinterfaceの指定自体が上記のようになるのか分かりませんでした。 newキーワードはクラスをインスタンス化するためのものであるという前提の話が誤解を含んでいるかと思います、TypeScriptでnewをクラス以外にも使えるという話にも思え、私も若干戸惑ってはいますが、 とにかく、インターフェース内に書いたnewとは、また別のnewの話と思います。(コンストラクタを示す関数名は言語によって様々なので発想の切り替えが混乱を来たしているのか) そのほかの疑問については何かの機会に回答するかもしれません ※助けになりたいけど、スマホ上だときつい
guest

回答1

0

newはコンストラクタの純粋仮想関数です
JavaScript/TypeScriptではコンストラクタが二種類あり、それらを抽象化します

interface Test{ new(x:number), num:number } //インターフェイスのコンストラクタ関数 function make(y:number):void{ this.num=y } const test:Test=new make(1) console.log("Test.num:"+test.num) interface I{ new(x:number) } class Sample{ //一般的なコンストラクタメソッド constructor(y:number){ this.n=y } private n:number pop():number{ return this.n } } let sample:I=Sample console.log("Sample.n:"+new sample(1).pop())
Test.num:1 Sample.n:1

この機能はサンプルも少なく、おそらく情報も少ないのではないかと思います
本回答も初見に当たり仕様確認を目的に作成しています
あるいは非推奨の可能性もあります
インターフェイス型へはクラスの静的インスタンスしか代入できません
またnew以外の実装を持たせるとエラーとなります
一般的な構文ではないと思うので、あまり深掘りする必要はないでしょう

投稿2025/01/31 04:39

Manabu

総合スコア105

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問