

TypeScriptのドキュメント等を読んでいてGenericsの所まで来たのですが、どういったものなのかイマイチつかめず質問します。  
(ActionScript3でのinterfaceとの違いやメリットが解らない?同じようなものなのか、全く違うものなのか)

たとえば_allLength変数に数値を足していくような処理を書くとして、TypeScriptでGenericsを使うと

[code]

    var _allLength = 0;
    
    interface SomeItem {
      getLength(): number;
    }
    
    function addLength<T extends SomeItem>(x: T) {
      _allLength = _allLength + x.getLength();
    }
    
[/code]

のような感じになると思うのですが(間違っていたらご指摘ください)  
ActionScript3では、同じような事を行なう場合、以下のようにInterfaceを定義してそのInterfaceを受け取る処理を書いていました

[code]

    //Interface定義(as3)
    public interface ISomeItem {
        function getLength():int
    }
    
    public var _allLength:int = 0;
    
    //Interfaceを受け取って処理(as3)
    public function addLength(item:ISomeItem):int {
        _allLength = _allLength + item.getLength();
    }
    
[/code]

これらが結果は同じになると思うのですがGenericsの使い方として合っているのかや考え方はこのような感じでいいのかなどイマイチ掴めていないのでこちらの投稿させていただきました

よろしくお願いします


CC BY-SA 4.0
2018-07-26T05:35:33.053
46982
2018-08-14T15:27:24.423
2018-07-26T11:26:28.937
29469
29469
question
typescript actionscript
TypeScriptのGenericsの使いどころや考え方？について


## ActionScriptの類似機能

> (ActionScript3でのinterfaceとの違いやメリットが解らない?同じようなものなのか、全く違うものなのか)

私はActionScriptは解りませんが、一般論で言うとインターフェースとジェネリクスは全く違うものです。

想像ですが、ActionScriptにジェネリクスに相当する機能が無いのであれば、ActionScriptからは離れて、ジェネリクスが有る言語の解説書で理解するのが早そうです。  
それでもあえて、ジェネリクスに似ているActionScriptの機能を挙げるなら[Vector](https://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/Vector.html)の型パラメーターだと思います。

  * ActionScriptでは `Vector.<T>` として 要素がT型であるVectorを示すようです。
  * TypeScriptでは `Array<T>` （もしくは `T[]` ）で要素がT型である配列を示します。  
これはジェネリクスの代表的な例です。

## 質問の例ではジェネリクスの必要が無い

質問の例に関してはジェネリクスを使う必要は無く、ActionScriptのコード例と同じように、インターフェース型の引数を取ればよいです。

[code]

    // ActionScript の例に合わせ値を戻すなら return が必要で数値の型は number です
    function addLength(x: SomeItem): number {
        return _allLength += x.getLength()
    }
    
[/code]

## ジェネリクスが役立つケース

ジェネリクスの解説となるとそれなりのボリュームになると思うので、書籍などを参照するのがよいと思いますが、もっとも単純な例として、[公式ドキュメント](https://www.typescriptlang.org/docs/handbook/generics.html)にも有る引数をそのまま返す関数を挙げておきます。

[code]

    function identity<T>(arg: T): T {
        return arg
    }
    
[/code]

このような単純なケースでも、ジェネリクスを使用しないならば、以下のいずれかが必要になるでしょう。

  * コンパイル時型チェックの恩恵を捨てるコード（any型、あるいは型キャストの使用）
  * 実行時の型チェック
  * 型だけ違う実装の大量生産

逆に言うと、上記のいずれかを行ない苦労している際にはジェネリクスの利用で楽ができる可能性があるということです。


CC BY-SA 4.0
2018-07-29T14:19:23.260
47079
2018-08-14T15:27:24.423
2018-08-14T15:27:24.423
3054
3054
46982
answer