通用接口 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
}
}
在您的 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
}
}
谁能解释为什么我会收到以下错误?
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
}
}
在您的 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
}
}