16822


mapみたいなのを定義したときに

[code]

    class Foo {
        x: number = 1
    }
    
    class Bar<A> {
      constructor(public a: A) {}
      map<B>(f: (A) => B): Bar<B> {
        return new Bar(f(this.a))
      }
    }
    
    var bar = new Bar<Foo>(new Foo)
    
    alert(bar.map(a => a.x).a) // 1
    
[/code]

ここまではいいんですが、

[code]

    alert(bar.map(a => a.fugaaaaaa).a) // undefined
    
[/code]

本当はAってFooなので、持ってないfugaaaaの参照でコンパイルエラーになってほしいんですが...。

fで受け取ったAがanyになってしまいます...  
何か対応策ありますでしょうか。


CC BY-SA 3.0
2015-09-21T06:16:29.973
16813
2015-09-21T13:23:03.057
9460
question
typescript
Genericで定義したAがanyになる


  1. まずはコンパイラオプションで`noImplicitAny`を有効にしてみてください。
  2. すると`map<B>()`メソッドの引数に渡す、アロー関数の引数`A`がエラーになります。 
    * これは本来型パラメータ`A`を渡す意図かと思いますが、この表記では`A`という名前のただの`any`型の引数となってしまいます
  3. `map<B>()`メソッドを以下のように書き換えてみてください。

[code]

    map<B>(f: (param:A) => B):Bar<B>{
        return new Bar(f(this.a))
    }
    
[/code]

4\. すると期待するような以下のエラーが吐かれるようになるかとおもいます(tsc 1.6.2で確認済)。

`error TS2339: Property 'fugaaaaaa' does not exist on type 'Foo'.`


CC BY-SA 3.0
2015-09-21T13:23:03.057
16822
2015-09-21T13:23:03.057
12396
16813
answer