質問するログイン新規登録
JavaScript

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

TypeScript

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

Q&A

解決済

2回答

362閲覧

【Typescirpt】部分型を用いたコードを細かく理解したい

kosuke05

総合スコア12

JavaScript

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

TypeScript

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

0グッド

0クリップ

投稿2025/08/31 02:11

0

0

実現したいこと

以下、参考書に掲載されているコードになります。
最初に渡された実引数が関数doubleに問題なく代入され、エラーが出ずに出力される理由をご教示頂きたく思います。

発生している問題・分からないこと

以下、私の解釈に問題がないかご確認頂きたく思います。
誤っている箇所がありましたら、ご指摘をお願いします。

①関数binに二つの引数が渡される
②関数binはBinaryFunc型を使用しており、二つの引数は問題なく渡すことが出来る
BinaryFunc型の右辺に関数doubleが記述されているため呼び出す。
③関数doubleはUnaryFunc型を使用しており、仮引数が一つのため第一引数のみ残され、計算結果が返る
→現在の解釈だと、BinaryFunc型はUnaryFunc型の部分型だと思っている。(理由は、BinaryFuncはUnaryFunc型のnumber型の引数を一つ持っており、さらに第二引数も持っているため)
関数binの時点ではBinaryFunc型なのに、関数doubleを呼び出すとUnaryFunc型で下位互換?になっている。
にもかかわらず、何故エラーが出ずに処理できてしまうのかが分からないです。

該当のソースコード

index.ts

1type UnaryFunc = (arg: number) => number; 2type BinaryFunc = (left: number, right: number) => number; 3 4const double: UnaryFunc = (arg: number) => arg * 2; 5const add: BinaryFunc = (left: number, right: number) => left + right; 6 7const bin: BinaryFunc = double; 8console.log(bin(10, 100));

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

解決に至らなかった。

補足

特になし

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

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

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

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

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

maisumakun

2025/08/31 11:04

JavaScriptレベルでは、引数の過不足は問題とされない(渡された個数以上の引数を仮引数としていた場合、不足分はundefinedとして処理が進む)ですが、そのことは把握された上での質問でしょうか?
kosuke05

2025/09/01 06:37

maisumakunさん ご返信頂き有難うございます。 引数の過不足は問題とされないのは把握しております。
xebme

2025/09/01 10:03

関数において引数1つと2つが部分型にあてはまるかは別に調べて下さい。
kosuke05

2025/09/02 00:08

xebmeさん ご教示頂き有難うございます。 参考にさせて頂きます。
xebme

2025/09/02 07:13 編集

一言で言えば「リスコフの置換原則」と同じ概念です。参考サイトでは、反変と共変が別々に説明されていますが、1つの関数で引数の反変と戻り値の共変の両方もありうると思います。typescriptの言語仕様を調べて下さい。
guest

回答2

0

自己解決

内容が理解できたため、こちらに残します。

【以前の解釈】
①関数binに二つの引数が渡される
②関数binはBinaryFunc型を使用しており、二つの引数は問題なく渡すことが出来る
BinaryFunc型の右辺に関数doubleが記述されているため呼び出す。

【現在の解釈】
②で関数doubleを呼び出すのではなく、関数doubleが代入される。
(引数二つを持った状態で関数doubleを見にいくのではなく、doubleをUnaryFunc型とみなし、【BinaryFunc = UnaryFunc】と考える事で部分型に代入しているため問題ないと解釈できた。

上記、分かりにくい書き方でしたらすみません。

投稿2025/09/02 00:18

kosuke05

総合スコア12

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

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

0

TypeScriptは構造によって型を抽象化します

class A{ x:number=0 y:String="" } class B{ y:String="" } type X=number|B type Y=number|String|B const a:A={ x:1, y:"Str" },b:B=a const x:Y=a,y:X=x console.log(b.y) console.log(y.y)
Str Str

シグネチャさえ合っていれば、ある型を別の型のオブジェクトとして扱うことができます

投稿2025/09/01 07:47

nanashi123

総合スコア141

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

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

kosuke05

2025/09/02 00:09

nanashi123さん ご教示頂き有難うございます。 参考にさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問