[英]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.