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

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

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

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

TypeScript

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

Q&A

解決済

1回答

636閲覧

共変性の意味について

ruuuu

総合スコア168

JavaScript

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

TypeScript

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

1グッド

1クリップ

投稿2022/07/25 14:48

サバイバルTypeScriptの「共変性」についてお聞きしたいことがあります

以下の箇所についてですが、「スーパータイプ」とあるのですが、そもそもどこにも継承しているような記述は見当たりませんでした。コードを見る限り、Animal及びDog型を定義しそれぞれ変数に適用させているだけのように思えます。
こちらの記述の意味につきまして、どなたかご助言頂けないでしょうか。

一方で共変では、Dog型の変数には、DogのスーパータイプであるAnimalは代入できません。

type Animal = { isAnimal: boolean }; type Dog = { isAnimal: boolean; isDog: boolean }; let pochi: Dog = { isAnimal: true, isDog: true }; let animal: Animal = pochi; //
suin👍を押しています

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

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

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

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

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

ruuuu

2022/07/26 12:04 編集

ありがとうございます > TypeScript では構造的部分型を採用してるので、Animal 型の要素 (isAnimal) を持つものは自動的に Animal の subtype になるような。 いまいち難しく完全には分かっていないのですが、こちらご説明頂いたような形で理解しておきたいと思います!
guest

回答1

0

ベストアンサー

そのページを書いたsuinと申します。

TypeScriptは構造的部分型という型システムを採用しています。PHPやJavaは公称型という型システムで、それらの言語とTypeScriptはちょっと違う仕組みだということが前提となる記事になっています。

TypeScript: 異なる2つの型システム「公称型」と「構造的部分型」 - Qiita

構造的部分型がどういうものかというと、ざっくりいうと、共通のプロパティを持っていれば、同じ型になるというものです。また、継承関係についても同様で、親の型となるオブジェクトのプロパティと同じものを、子の型となるオブジェクトが持っていれば、その2つの型には継承関係が成立します。

今回の例ですと、DogインターフェースがisAnimal: booleanを持っています。Animalインターフェースも同じく、isAnimal: booleanを持っています。そのため、AnimalはDogの親、つまりスーパータイプが成り立つことになります。

投稿2022/07/29 11:38

suin

総合スコア19

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

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

suin

2022/07/29 11:41

加えて、こちらの記事「[配列の共変性 (covariance) | TypeScript入門『サバイバルTypeScript』](https://typescriptbook.jp/reference/values-types-variables/array/array-type-is-covariant)」については、サンプルコードが読者にとって分かりにくいとも思ったので、継承関係がはっきりするinterface構文を使ったサンプルコードに書き直したいと思います😌 ``` // before type Animal = { isAnimal: boolean }; type Dog = { isAnimal: boolean; isDog: boolean }; // after interface Animal { isAnimal: boolean; } interface Dog extends Animal { isDog: boolean; } ```
ruuuu

2022/07/31 04:16

ご回答ありがとうございます。 大変ご丁寧に教えて頂き、助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問