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

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

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

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

JavaScript

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

TypeScript

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

Q&A

0回答

1821閲覧

TypeScriptでは構造体 (のようなもの) の定義に、なぜinterfaceを使うのでしょうか?

u_09

総合スコア18

ECMAScript

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

JavaScript

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

TypeScript

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

0グッド

0クリップ

投稿2021/02/07 16:15

前提

他言語の経験はありますが、TypeScriptは最近使い始めました。
調べて思うのが、interfaceに変数をもたせるといいますか、例えばC言語でいう構造体のような使い方をinterfaceで実現している場合が多いように感じます。
interfaceは関数定義だけをするもので、実装や実装に必要な変数は実クラス等の実装時に宣言するものだと認識しています。

一般的にどうなっているのかと思いnode_modulesに入っている適当なパッケージを見てみたりもしたのですが、types/*.d.tsに変数をもたせたinterfaceを定義している場合が多いように思いました。

ts

1export interface Payload { 2 type: string; 3}

質問

構造体のようなものを定義したいのであれば、typeや関数を持たないclassを使えば良さそうなのに、なぜinterfaceを使うのでしょうか?

自分なりに考えてみた回答

  • classは後から導入されたのであまり使う文化がなく昔からの名残でinterfaceを利用
  • コンストラクタを書くのが面倒
  • そもそもtsでは関数や変数というよりオブジェクトとしてざっくり扱っている(?)のであまり区別しない

あまりts, jsに詳しくなく、そもそもおかしなことを言っていましたら申し訳ありません。
interfaceとtypeの違いなどは調べるとたくさん出てくるのですが、classとinterfaceの比較や、そもそも構造体のようにinterfaceを使う文化についてはうまく調べられず質問させていただきました。

ご回答よろしくお願いいたします。

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

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

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

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

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

Zuishin

2021/02/07 22:59

> 構造体のようなものを定義したいのであれば、typeや関数を持たないclassを使えば良さそうなのに、なぜinterfaceを使うのでしょうか? どういうふうに「良さそう」なんでしょうか? それによってどのようなメリットがありそうだというイメージを持っていますか?
u_09

2021/02/08 11:44 編集

コメントありがとうございます。 質問の意図としては、どちらかというと逆で、interfaceを一般的なインターフェイス以外の用途として使うのに何かメリットがあるのかという意味のつもりでした。 その上で、あえてメリットという言い方をするなら、「良さそう」だと思ったのは、interfaceをインターフェイスとしてのみ利用できるという点でしょうか。 typeやclassで実現することに機能的なメリットがあるかと言われると、今回の利用の仕方では、typeの場合は微妙な差異がある程度なのでユースケイース次第、classの場合はコンストラクタを作れるので初期化が楽という点がメリットかと思います。ただ、質問の意図としてはこれらの方が便利なのになぜinterfaceなのか、ということではなく、一般的なインターフェイスは関数定義を集めたものだと思っているので、変数定義に使うのはどうしてなのかということをお聞きしたかったです。
Zuishin

2021/02/08 11:45

一般的なというと Java ですか? C# ではプロパティもインターフェースに含めることができます。 構文の定義は言語によって様々です。 大事なことはどのようにしたらプログラムを作りやすくなるかだと思いますが、関数に限定することで何かメリットははりますか?
u_09

2021/02/08 11:48

typeやclassで良さそう、という表現が質問をわかりにくくしていましたら申し訳ありません。 これらを出した意図としては、そもそもtsで構造体のようなことをしたいときに、interface以外の実現方法がないのであればそいういうものとして受け入れるのですが、代替機構というよりそちらの方が適切に見える他の機構 (classやtype) があるにもかかわらずなぜ interface を利用するのか、と感じたからです。 言葉足らずですみません。
Zuishin

2021/02/08 11:51

これは Java と TypeScript の決定的な違いですが、TypeScript はクラスベースではなくプロトタイプベースなので、TypeScript はクラスそれ自体がインスタンスです。 Java のクラスとは名前が同じだけで根底から違うので、同じように考えない方がいいと思います。TypeScript のインターフェースの方が TypeScript のクラスよりも Java のクラスに近い側面もあります。まず同じ用語が同じものを指すという考えを捨てるところから始めると理解しやすくなるかもしれません。
Zuishin

2021/02/08 11:58

また TypeScript のメソッドは V テーブルで管理される Java と違い、関数オブジェクトを変数に入れたもので、構造体におけるメンバー変数と本質的な違いはありません。
u_09

2021/02/08 11:58

すみません、コメントいただいてることに気づかず補足コメントを投稿してしまってました。 > 一般的なというと Java ですか? 具体的にはJavaなどの言語ですが、インターフェイスという単語自体は割と関数定義のみ (Javaでいうなら抽象関数の変数定義がない版) かと思っているのですが、そこの認識がそもそも違うということですよね。 繰り返しになりますが、限定することのメリットをお聞きしたいのではなくインターフェイスってこういういうものではない気がするけど、どうなんですかね?みたいなことを聞きたかったです。 > これは Java と TypeScript の決定的な違いですが、TypeScript はクラスベースではなくプロトタイプベースなので、TypeScript はクラスそれ自体がインスタンスです。 なるほど。知りませんでした。 ご回答としては、インターフェイスという単語の定義も言語によるし、tsでは変数も含めるもの (その他の例としてはC#もそう) をインターフェイスと呼ぶということですかね。
Zuishin

2021/02/08 12:00

C# のプロパティは分類としては変数ではなく関数なので、また概念が変わってきます。言語によって様々です。
u_09

2021/02/08 12:09

わかりました。ありがとうございます。 > これは Java と TypeScript の決定的な違いですが、TypeScript はクラスベースではなくプロトタイプベースなので、TypeScript はクラスそれ自体がインスタンスです。 あと、この部分を踏まえると、クラスを定義してしまうとtsの場合はインスタンスができてしまうので、純粋に定義だけしたいならinterfaceの方が良いという意味だったのでしょうか?
Zuishin

2021/02/08 12:16

クラスとインターフェースでは用途が違います。インターフェースはそれ自体独立して存在できません。使うにはオブジェクトが必要になります。 「構造体のような使い方」というのを「メンバー変数を持っている」と解釈しましたが、インターフェースは概念的なもので、単独で何かの値を保持する変数を持てません。そのインターフェースを使用するオブジェクトが変数を持ち、インターフェースはそのオブジェクトがインターフェースで定義される変数を持っていることを保証するだけです。 同じ言葉だから同じものだという先入観を捨て、TypeScript の初歩から順を追って学習していく方が、つまみ食いするより効率的だと思います。
Zuishin

2021/02/08 12:18

というより、極端に言えば TypeScript は JavaScript の糖衣構文でしかないので、まず JavaScript から学習した方が理解しやすいと思います。
u_09

2021/02/08 13:02

>「構造体のような使い方」というのを「メンバー変数を持っている」 ここに関しては、メンバ変数というよりC言語の構造体のイメージで、複数の型を合わせた型の定義くらいの意味でした。 ただ、tsのインターフェイスはそもそも私が思っていたものとは違い、それを理解するにはきちんと学んだ方がいいよ、というのはわかりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問