我指的是“this-typing”引用.text()
和here。
我的理解是,使用this
作为类型引用当前类或者点的任何剩余(从而允许继承的方法引用它们自己的类而不是它们的父类)。
有人可以解释为什么这不起作用:
class Test {
children: Array<this>;
constructor() {
this.children = [new Test()];
}
}
(我的目标是使用继承的类来执行此操作,但它不适用于基类。由于this
的类型为Test
,为什么不能children
为一个Test
?
答案 0 :(得分:3)
不,当使用this
作为类型时,您指的是实例,而不是类
它被称为Polymorphic this types,意思是这样使用:
class Point {}
class Point2D extends Point {
constructor(public x: number, public y: number) {
super();
}
}
class Point3D extends Point2D {
constructor(x: number, y: number, public z: number) {
super(x, y);
}
}
class Builder2D {
protected _x: number;
protected _y: number;
x(x: number): this {
this._x = x;
return this;
}
y(y: number): this {
this._y = y;
return this;
}
build(): Point {
return new Point2D(this._x, this._y);
}
}
class Builder3D extends Builder2D {
private _z: number;
z(z: number): this {
this._z = z;
return this;
}
build(): Point3D {
return new Point3D(this._x, this._y, this._z);
}
}
let p1 = new Builder3D().x(0).y(0).z(0).build();
如果Builder2D.x()
和Builder2D.y()
返回Builder2D
:
x(x: number): Builder2D {
this._x = x;
return this;
}
y(y: number): Builder2D {
this._y = y;
return this;
}
然后这会失败:
let p1 = new Builder3D().x(0).y(0).z(0).build();
使用:
'Builder2D'
类型中不存在属性'z'
在您的方案中情况并非如此,您不想返回this
据我所知,this
类没有类型,但你可以这样做:
class Test {
public children: Array<Test>;
constructor() {
this.children = [new Test()];
}
}
interface OtherTest {
children: Array<OtherTest>;
}
class OtherTest extends Test {
constructor() {
super();
this.children.push(new Test(), new OtherTest());
}
}
let t1 = new Test();
let c1 = t1.children[0]; // typeof c1 is Test
let t2 = new OtherTest();
let c2 = t2.children[0]; // typeof c2 is OtherTest
答案 1 :(得分:1)
让我们定义派生类:
class TestDerived extends Test {
someMethod():void { }
}
正如您已经指出的那样 - this
作为类型引用当前类,因此children
成员TestDerived
的类型为TestDerived[]
。所以我们可以这样做:
let b = new TestDerived ();
b.children[0].someMethod();
如果typescript允许我们使用Test
的实例填充此数组(在super的构造函数中),我们将失去类型安全性(someMethod
中未定义Test
)。< / p>