簡體   English   中英

方法的單獨公共/私人簽名

[英]Separate public / private signature for method

如果我有這樣的方法:

private render(componentName: string)

有沒有辦法為此添加一個公共簽名,只允許某些特定的字符串,如

public render(componentName: "Avatar" | "Message" | "Link")

您可以添加兩種重載,一種用於方法的公共接口,一種用於方法的實現簽名。

實現簽名不能從任何地方調用,它只用於實現中的參數類型:

class Cls {
    public render(componentName: "Avatar" | "Message" | "Link"): void
    public render(componentName: string) {
        componentName = "" // componentName is string 
    }
    m() {
        this.render("Avatar") // ok 
        this.render("Avatar_") // err
    }

}

游樂場鏈接

注意:對於 TS 中相同方法的不同重載,無法使用不同的可訪問性修飾符。 你可以有不同的方法。

class Cls {
    public render(componentName: "Avatar" | "Message" | "Link"): void {
        this.renderInternal(componentName)
    }
    private renderInternal(componentName: string) {
        componentName = "" // componentName is string 
    }
    m() {
        this.render("Avatar") // ok 
        this.renderInternal("Avatar_") // ok
    }

}

游樂場鏈接

似乎不可能使用不同的訪問修飾符來重載簽名,但您可以使用接口實現所需的結果:

interface IFoo {
    render(componentName: "Avatar" | "Message" | "Link"): void;
}

class Foo implements IFoo {
    public render(componentName: string): void {
        // ...
    }
}

const foo: IFoo = new Foo();
foo.render("Message"); // OK
foo.render("unto Caesar that which is Caesar's"); // error

Foo有其他成員時,為了避免代碼重復,可以自動從Foo派生IFoo接口:

type IFoo = Omit<Foo, 'render'> & {
    render(componentName: "Avatar" | "Message" | "Link"): void;
}

游樂場鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM