提问者:小点点

具有接口类类型的泛型


有人能解释一下为什么我会出现以下错误吗?

类型“A”上不存在属性“prop1”。ts(2339)

代码

interface A {
  prop1:string;
};

class myClass<A> {
  ptop1: string;
  constructor(input: A) {
    this.ptop1 = input.prop1;  //error happens in this line (Property 'prop1' does not exist on type 'A'.ts(2339))
  }
}

共3个答案

匿名用户

之间存在冲突

class myClass{
  ptop1:string;
  constructor(input:A){
    this.ptop1=input.prop1;
  }
}

匿名用户

在你的课堂上,

泛型类型表示任何类型,因此您只能使用泛型参数,就好像它可以是任何和所有类型一样,因此您不能访问任何特定的属性。

也就是说,在您的情况下,您应该使用更具体的< code>T类型,使用< code>implements关键字来告诉编译器泛型类型T是实现< code>A接口的东西。


interface A {
  p1: string
}

/* THIS DOES NOT WORK */
class c <T implements A> {
  t1: string;
  constructor(t: T){
    this.t1 = t.p1
  }
}

不幸的是,typescript不允许<code>T在泛型声明中实现</code>表达式;然而,通过滥用extends关键字,有一种变通方法,表达能力较差

interface A {
  p1: string
}

class c <T extends A> {
  t1: string;
  constructor(t: T){
    this.t1 = t.p1
  }
}

匿名用户

你可以这样做

interface A {
  prop1: string
}

// constraint A1 with A
class myClass <A1 extends A> {
  ptop1: string
  constructor(input: A1){
    this.ptop1 = input.prop1
  }
}

游戏场