我在Typescript中有一个存储类,该存储类实现了Storage
接口,例如MyStorage
。但是它有太多方法,所以我想用它代替MyStorage.getCandy
-MyStorage.Candies.getCandies
。
结构看起来如何?
我认为,类似
export class MyStorage implements Storage {
public constructor {} ...
Candies: {
getCandies() { ... }
}
Balls: {
...
}
}
答案 0 :(得分:2)
您可以制作MyStorage
和抽象类。在MyStorage
内部,您可以使用将在MyStorage
的所有子类中使用/共享的功能。然后创建扩展MyStorage
的具体类,其中将包含该子类的特定功能。
存储界面
export interface Storage {
...abstract interface methods.
}
抽象存储类
export abstract class MyStorage implements Storage {
...shared functionality between subclasses of MyStorage
}
具体实现
export class CandiesStorage extends MyStorage {
...your Candies specific functionality.
}
export class BallStorage extends MyStorage {
...your Ball specific functionality.
}
答案 1 :(得分:2)
您应该考虑这样一个巨大的物体是否有意义。做所有事情的类通常不是一个好主意,您应该将它们分成几个类,每个类都处理特定的对象类型(例如,一个用于Balls的类,一个用于Candies的类等)并使用这些类。如果要共享代码,则可以将其放在基类中(如果没有具体功能,则最好是抽象基类)。一个解决方案可能看起来像这样:
export abstract class MyStorage implements Storage {
}
export class CandiesStorage extends MyStorage {
getCandies() {}
}
export class BallsStorage extends MyStorage {
}
话虽这么说,如果由于您自己的原因这是不可行的,则可以拆分这样的功能,只是操作符错误,您需要使用Candies
初始化=
字段不能与:
一起使用(:
是类型注释,而不是类内部的字段初始化)。这种方法的一个问题是,在对象文字函数内部(例如getCandies
),this
将引用对象文字(如果您使用常规函数)。最简单的解决方案是使用箭头函数或添加一个额外的owner
字段以允许访问包含的类实例。这是示例这两个选项的解决方案:
export class MyStorage implements Storage {
public constructor (){ }
Candies = {
getCandies: () => {
this.Balls // this refers to MyStorage
}
}
Balls = {
owner: this, // capture the owner object in a field
getBalls() {
this.owner.Candies // this refers to the Balls objects, but we can use owner to access the container
}
}
}
答案 2 :(得分:0)
你不能。 MyStorage是一个类,但是getCandies是一个不是静态的实例方法。