Использование внешнего абстрактного класса в Typescript без его расширения - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть один модуль с именем utils.tsx, так что:

interface IUtils {
    toUri: (route: string) => string
}

export default abstract class Utils implements IUtils {
    public toUri = (route: string) => {
        return route
    }
}

и другой файл, в котором я хочу использовать этот модуль утилит:

 import Utils from '../helpers/utils'

 class Router  {
     private getBuilder = (search: string) => {
       const path = Utils.toUri(search)
     }
 }

Когда я пытаюсь использовать Utils.toUri Я получаю ошибку TS:

[ts] Property 'toUri' does not exist on type 'typeof Utils'.

Мое намерение состоит в том, чтобы вызвать функцию внешнего абстрактного класса, не расширяя класс Router и не наследуя его (поскольку у меня будет больше одного внешнего модуля в основном файле).

Может ли кто-нибудь помочь мне обойти это и понять?

PS: я тоже пробовал с public abstract toUri(). Возможно, я перепутал подпрограммы из других языков программирования и путал использование static с abstract здесь ...

1 Ответ

0 голосов
/ 09 ноября 2018

Вы не хотите, чтобы Utils реализовывал IUtils, поскольку Utils является типом instance класса. Похоже, вы хотите, чтобы конструктор Utils (тип typeof Utils) реализовал IUtils. То есть вы хотите, чтобы toUri был статическим методом класса Utils. Как это:

abstract class Utils  {
  public static toUri = (route: string) => {
    return route
  }
}

Нет способа аннотировать объявление class Utils о том, что статическая сторона класса реализует IUtils. К счастью, конструктор Utils автоматически будет восприниматься как нечто, реализующее IUtils без необходимости писать implements IUtils в любом месте. Спасибо, структурный набор :

declare function takeIUtils(iUtils: IUtils): void;
takeIUtils(Utils); // works anyway

Это должно позволить вашему классу Router вести себя как нужно.


Примечание, интересно, действительно ли вы хотите, чтобы Utils был классом вообще. Если вы никогда не хотите видеть экземпляр Utils, например class X extends Utils {...}; new X(), то вы, вероятно, делаете жизнь излишне тяжелой для себя. Может быть, это должно быть значение :

export const Utils : IUtils = {
  toUri(route: string) {
    return route
  }
}

Или namespace:

export namespace Utils {
  export function toUri(route: string) {
    return route
  }
}

Или модуль, или что-то.


В любом случае, надеюсь, это поможет. Удачи!

...