Typescript中具有不同参数类型的相似方法

问题描述 投票:0回答:1

我有以下打字稿方法:

authorize(permission: string, id?: number) : Observable<boolean> {

  return this.authorize(Permission[permission], id);

}

authorize(permission: Permission, id?: number) : Observable<boolean> {
  // authorization code
}

第一个接收String类型的权限,并将其转换为Permission枚举类型。

然后调用第二个接受枚举Permission类型的权限的方法。

但是我得到了错误:

Duplicate function implementation.

似乎Typescript忽略了参数类型。

有没有办法克服这个问题?

typescript
1个回答
0
投票

TypeScript的包含此类注释的静态类型系统在编译为JavaScript时为erased,这实际上是在运行。因此,您提议的内容最终将编译为类似(假设ES2017)

class Thingy {
    authorize(permission, id) {
        return this.authorize(Permission[permission], id);
    }
    authorize(permission, id) {
        // authorization code
    }
}

在JavaScript中,不能有两个具有相同名称的方法...好吧,你[[can,但是只会调用第二个方法。因此这种方法行不通。


您需要做的是只有一个方法,其实现可以处理两种调用方法。使用TypeScript,您可以将不同的呼叫签名表示为overloads,但是您仍然必须拥有一个可以完成工作的实现。

但是,在您的示例中,不必要重载,因为您可以将两个签名的组合表示为单个签名,其permission参数是unionstringPermission。而且尽管我不知道Permission是什么(这就是minimum reproducible examples有用的原因),但只要它不是string的类型别名,您就可以按照您想要的方式进行分支实现:] >

authorize(permission: string | Permission, id?: number): Observable<boolean> { if (typeof permission === "string") { return this.authorize(Permission[permission], id); } else { // authorization code }

好的,希望能有所帮助;祝你好运!
© www.soinside.com 2019 - 2024. All rights reserved.