Typescript 中的子类化

ann*_*mph 6 interface subclass typescript

我在 Typescript 中有一个存储类,它实现了Storage接口,比如MyStorage. 但是它的方法太多了,所以我想用它来代替MyStorage.getCandy- MyStorage.Candies.getCandies。结构可能看起来如何?

我假设,像

export class MyStorage implements Storage {

public constructor {} ...

Candies: {
   getCandies() { ... }
}

Balls: {
...
}
}
Run Code Online (Sandbox Code Playgroud)

Tit*_*mir 5

你应该考虑这样一个巨大的物体是否有意义。做所有事情的类通常是一个坏主意,您应该将它们分成几个类,每个类处理特定的对象类型(即一个类用于球,一个类用于糖果等)并使用这些类。如果你想共享代码,你可以把它放在一个基类中(如果它没有具体的功能,最好是一个抽象基类)。解决方案可能如下所示:

export abstract class MyStorage implements Storage { 

}
export class CandiesStorage extends MyStorage { 
    getCandies() {}
}

export class BallsStorage extends MyStorage { 
}
Run Code Online (Sandbox Code Playgroud)

话虽如此,如果由于您自己的原因这不可行,您可以像这样拆分函数,您只是操作符错误,您需要Candies使用=not with :(:是类型注释而不是类中的字段初始化来初始化字段)。这种方法的一个问题是,在对象字面量函数(例如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
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)