1

我有一个具有私有可选属性(private foo?: Foo)的类。在类的私有代码中,我需要能够验证此属性是否存在,以便我可以在方法开始时处理一次失败,然后在块的其余部分将其作为非可选处理。

如果 foo是公开的,下面的代码就像一个魅力。但是,由于我需要 foo 是私有的,所以它不起作用。不是验证this是否符合FooBar & FooContainer,而是类型this变为never

这种行为对于我不想让外部代码验证私有属性的存在的公共使用完全有意义。但是,我正在尝试找到一个类似类型谓词的解决方案,我可以在我的班级中私下使用,以使有问题的属性成为非可选的。

interface Foo {
    bar: string;
}

interface FooContainer {
    foo: Foo;
}

class FooBar {
    private foo?: Foo;
    bar?: string

    constructor(foo?: Foo, bar?: string) {
        this.foo = foo;
        this.bar = bar;
    }

    private isFooContainer(): this is FooContainer {
        const { foo } = this;
        return typeof foo !== "undefined";
    }
    
    printFoo() {
        if (!this.isFooContainer()) throw new Error("There is no foo!!!!");
        // For the rest of this method `this.foo` should be typed as `Foo` rather than `Foo | undefined`
        console.log(this.foo.bar); // <--- No optional chaining (`this.foo?.bar`) required here.`
    }
}
4

1 回答 1

1

它像内联支票本身一样简单吗?我想知道我是否错过了拥有接口和谓词的目的,但这对我来说似乎很好......

interface Foo {
    bar: string;
}

class FooBar {
    #foo?:Foo;
    bar?:string;

    constructor(foo?:Foo, bar?:string) {
        this.#foo = foo;
        this.bar = bar;
    }
    
    printFoo() {
        if(typeof this.#foo === "undefined") throw new Error("There is no foo!!!!");
        console.log(this.#foo.bar); 
    }
}

打字稿游乐场

于 2021-04-07T23:57:07.833 回答