【发布时间】:2018-08-24 09:14:45
【问题描述】:
有没有办法将以下代码转换为通用打字稿代码?我想要一个类实现一些接口 A 并接受两个 A 类型的元素并为接口 A 的属性返回不同的值取决于一些布尔标志。我查看了 typescript 泛型和自定义类型,但无法弄清楚。
本质上,我希望一个元素在纵向和横向中返回不同的值,而不必在每次我的应用程序的方向发生变化时都求助于mySprite.setPosition(new Vector(10,10)) 之类的东西。我是出于好奇而问这个问题,我不是在寻找这种情况的其他解决方案,我知道还有更多。
我能否定义一些通用类型,比如 Variant,这样对于我的精灵所具有的任何 A 类型的属性,我都可以执行类似mySprite.myPropOfTypeA=new Variant<A>(new A("landscape value"), new A("portrait value")) 这样的操作,以便 @987654323 @ 根据isLandscape() 的结果返回不同的值?我希望它是通用的,这样我就不必为我想要表现得像这样的每个属性创建派生类。谢谢!
interface IVector{
x:number,
y:number;
}
class Vector implements IVector{
private _x:number;
private _y:number;
public get x() {return this._x;}
public get y() {return this._y;}
constructor(x:number, y:number){
this._x=x;
this._y=y;
}
}
class VariableVector implements IVector{
private _landscape: IVector;
private _portrait: IVector;
constructor(landscape: IVector, portrait: IVector){
this._landscape=landscape;
this._portrait=portrait;
}
public get x() {return isLandscape()? this._landscape.x:this._portrait.x;}
public get y() {return isLandscape()? this._landscape.y:this._portrait.y;}
}
let mySprite=new Sprite(new VariableVector(new Vector(0,0), new Vector(10,10)));
谢谢!
【问题讨论】:
-
您可以阅读
mySprite.myPropOfTypeA.value而不是mySprite.propOfTypeA? -
我可能不应该使用 value 作为名称选择,但在这种情况下 value 将是接口 A 中的一个属性,类似于
interface A {value: number}。一个更好的例子是 mySprite.position.x,其中 mySprite.position 的类型是IPosition和interface IPosition {x:number, y:number;},我会这样做mySprite.position=new Variant<IPosition>(pos1, pos2),pos1 和 pos2 是任何实现 IPosition 接口的对象。
标签: javascript typescript generics