通用接口 class 类型

Generic with interface class type

谁能解释为什么我会收到以下错误?

Property 'prop1' does not exist on type 'A'.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))
  }
}

<A> 和类型 interface A 之间存在冲突。此行 myClass <A> 中的代码混淆了 myClass class,因此 constructor (input: A) 语句将 A 引用到 <A> 中的 A,而不是 interface A。 为什么不直接使用这样的代码?

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

你可以这样做

interface A {
  prop1: string
}

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

Playground

在您的 class 中,<A> 表示 generic;因此,在 class 中,A 指的是泛型类型,忽略您之前可能已声明此符号的任何特定类型或接口。

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

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


interface A {
  p1: string
}

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

不幸的是,打字稿不允许通用声明中的T implements A表达式;但是,通过滥用 extends 关键字

有一个变通方法,表达能力较差
interface A {
  p1: string
}

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