Ссылочный статический метод в типизированном шрифте: автоматически подбирать сигнатуру метода - PullRequest
1 голос
/ 10 мая 2019

У меня есть класс со статическим методом:

class Application {
  static get(): string {
    ...
  }
}

Теперь я хочу сослаться на этот статический метод get в другом классе.Я знаю, что могу сделать это:

class Caller {
  klass: { get (): typeof Application["get"] }
}

Это легко работает, если метод не принимает аргументов. Редактировать: Пожалуйста, посмотрите ниже, почему это неправильно

Теперь, если я добавлю аргумент:

class Application {
  static get(argument: string): string {
    ...
  }
}

... Я также должен изменить Caller (илюбой другой класс, имеющий эту подпись):

class Caller {
  klass: { get (argument: string): typeof Application["get"] }
}

Есть ли способ избежать этого?Потому что очевидно, что klass.get всегда следует за сигнатурой функции Application.get.Есть ли способ сказать машинописи что-то вроде этого:

class Caller {
  klass: { get (signatureof typeof Application["get"]): typeof Application["get"] }
}

Редактировать : На самом деле я только что понял, что выше неправильно : я действительно определил *От 1028 * до вернуть что-то, что ведет себя как typeof Application["get"].

Я дал ему новый выстрел с этим:

class Caller {
  klass: {
    [Key in keyof typeof Application]: typeof Application[Key]
  }
}

... хотя мне еще предстоитпосмотрим, решит ли это это, brb.


Edit 2 : оба пути кажутся возможными:


// reference all properties
class Caller {
  klass: {
    [Key in keyof typeof Application]: typeof Application[Key]
  }
}

// or if only one specific thing is needed
// reference one property
class Caller {
  klass: {
    get: typeof Application["get"]
  }
}

К сожалению, если метод ссылок более сложныйНапример, get() получает доступ к статическим свойствам, определенным в Application, однако это становится более сложным, поскольку машинописный текст будет жаловаться на то, что они не были найдены (если есть ссылка только на метод, а не на каждое свойство).

ТакЯ думаю, что путь должен состоять в том, чтобы ссылаться на все свойства, чтобы быть на безопасной стороне.

Ответы [ 2 ]

3 голосов
/ 10 мая 2019

Вы можете ссылаться на тип статического метода, используя typeof Class['methodName']. Вы можете использовать этот тип напрямую как тип для get:

class Caller {
  klass: {
    get: typeof Application["get"]
  }
}

Это будет означать get того же типа, что и метод get из Application. typeof Application["get"] является сигнатурой всей функции метода, поэтому любые изменения параметров или типа возвращаемого значения будут отражены в get в klass

0 голосов
/ 10 мая 2019

Вы можете определить тип get в том же файле, например:

type ApplicationGetType = (arg: string) => string;

Затем используйте это в обоих определениях функций, тогда любые изменения должны быть сделаны только один раз, в определениях типов.

Вы также можете попробовать Parameters<Application['get']> и ReturnType<Application['get']>, чтобы получить правильные типы при обращении к этому методу.

...