Определяемый пользователем тип охраны без передачи параметра - PullRequest
0 голосов
/ 21 апреля 2020

Допустим, у меня есть эти классы:

export abstract class AbstractSubjectChild<T extends Subject>
{
    protected parent: T | undefined;

    public hasParent()
    {
        return this.parent != null;
    }

    public setParent(parent: T): void
    {
        this.parent = parent;
    }

    public getParent(): T | undefined
    {
        return this.parent;
    }
}

class Child extends AbstractSubjectChild<Post>
{   
}

И я хочу сделать что-то вроде этого:

const child = new Child();

if (child.hasParent()) {
    const post: Post = child.getParent();
}

Есть ли способ сказать компилятору TS выводить тип на основе на hasParent() результат без необходимости явно использовать as Post везде?

1 Ответ

2 голосов
/ 21 апреля 2020
export abstract class AbstractSubjectChild<T extends Subject>
{
    protected _parent?: T;

    public set parent(parent: T): void
    {
        this._parent = parent;
    }

    public get parent(): T | undefined
    {
        return this._parent;
    }
}

напишите свой класс таким образом, и вы можете сделать:

if (child.parent) {
  const post = child.parent;
  // everywhere in this block scope is now aware of the type of post
}
...