如何在打字稿中的方法中实例化泛型T?

时间:2018-08-09 06:38:17

标签: angular typescript generics

FileInformation是一个具有字符串属性path的类。我试图将其作为类型传递给方法getValue<T>(),然后从返回的对象中获取我的属性。我的问题是该函数不知道什么是T,因此无法实例化它。有没有一种方法可以根据调用者方法创建T的新实例?

呼叫者

This.getValue<FileInformation>().subscribe((value) => {
 console.log(v.data); // object is returned
 console.log(v.data.path); // always undefined
})

方法

private value: Subject<ISignalRHub<any>> = new Subject<ISignalRHub<any>>();


    public getValue<T>() {
              this.value = new Subject<SignalRHub<T>>();
              this.hubConnection.on(CRUD.create, (data: T) => {
              this.value.next({ method: CRUD.update, data: data });
         });

        const val = new Subject<ISignalRHub<T>>();
        this.value.subscribe((v: ISignalRHub<T>) => {
          val.next(v);
        });
        return val.asObservable();
      }

更新

这是值和嵌套对象的输出

 console.log(v);
 console.log(v.data);
 console.log(v.data.path);

enter image description here

更新

基于下面的评论,我的问题是JSON解析器,该序列化了Pascal情况下的所有属性。感谢@Antoniossss指出了这一点。

1 个答案:

答案 0 :(得分:1)

This.getValue<FileInformation>().subscribe((value) => {
 console.log(v.data); // object is returned
 console.log(v.data.path); // always undefined
})

好吧,这里的值永远不会是FileInformation类型,并且它将始终是纯JS对象。此处使用的类型仅用于使用控制(检测对不存在的属性的访问)。这对于接口非常有效-因为对象可能与接口签名匹配。对于课堂实例,您必须自己创建那些人

    This.getValue()
    .pipe(
       map(jsonData=>new FileInformation(jsonData)
     ).subscribe((value:FileInformation) => // here value will be indeed a FileInformation instance
    })

很显然,您必须创建constructor才能使此示例正常工作,它将json映射到您的FileInformation中。