代码之家  ›  专栏  ›  技术社区  ›  JSON

如何在typescript的方法中实例化泛型T?

  •  0
  • JSON  · 技术社区  · 6 年前

    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情况下序列化所有属性。感谢@antoniosss指出这一点。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Antoniossss    6 年前
    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映射到 文件信息 .