Могу ли я описать аргументы методов класса повторно используемым способом?

#typescript

Вопрос:

Давайте предположим, что следующий фрагмент кода.

 class MyClass {
  method1(arg1: string, arg2: number, arg3: number) {}
    
  method2(arg1: string, arg2: number, arg3: number) {}
}
 

Я хотел бы взять ту часть, которая говорит arg1: string, arg2: number, arg3: number , и выразить ее таким образом, чтобы я мог использовать ее повторно.
Надеюсь, приведенный ниже пример будет иметь смысл, даже если он явно не работает

 interface MyClassMethodArgs {
  arg1: string;
  arg2: number; 
  arg3: number;
}

interface MyClass {
  // How can I express "arg1: string, arg2: number, arg3: number" as MyClassMethodArgs?
  method1(arg1: string, arg2: number, arg3: number): void;
  method2(arg1: string, arg2: number, arg3: number): void;
}

class MyClassImpl implements MyClass {
  // How can I inherit the types of MyClass without repeating them?
  method1(arg1, arg2, arg3) {}
    
  method2(arg1, arg2, arg3) {}
}
 

Комментарии:

1. Повторное использование не является самоцелью. И повторное использование не достигается таким образом. Повторное использование работает на уровне компонентов, если это имеет смысл.

2. @axiac цель на самом деле состоит в том, чтобы поддерживать меньше вещей и выражать, что существуют методы для обработки одного и того же ввода по-разному. Что, как вы могли бы возразить, также является задачей в первую очередь проведения занятий. Но это слишком мета для этого вопроса здесь.

3. Существует ли несколько реализаций interface MyClass ?

4. Давайте предположим, что в одном случае да, в другом случае нет. На что вы собирались указать в обоих случаях?

Ответ №1:

Ты мог бы сделать это:

 type ThreeNumberFunction = (a: number, b: number, c: number) => void

class MyClass {
  method1: ThreeNumberFunction = (a, b, c) => {
    // ...
  };
  method2: ThreeNumberFunction = (a, b, c) => {
    // ...
  };
}
 

К сожалению, у этого есть недостаток в создании новых функций для каждого экземпляра класса вместо поиска методов в классе, поэтому это может снизить производительность и использовать больше памяти. Лично я, если бы сигнатуры методов не были очень сложными или мне специально не требовалось, чтобы функции были привязаны к экземпляру , чтобы я мог передавать obj.method1 их без необходимости вызова obj.method1.bind(obj) , тогда я бы просто не беспокоился о небольшом количестве дублирования.

Кроме того, обратите внимание, что вы не можете сделать то же самое с помощью интерфейса, поскольку типы параметров не выводятся из сигнатур методов интерфейса:

 interface MyInterface {
  method1: ThreeNumberFunction;
  method2: ThreeNumberFunction;
}

// parameters implicitly have type 'any'
class MyClass2 implements MyInterface {
  method1(a, b, c) {
    // ...
  }
  method2(a, b, c) {
    // ...
  }
}
 

Ссылка на игровую площадку

Комментарии:

1. Спасибо, это очень полезно. Я предположил, что это так, но надеялся, что есть способ описать это без недостатков. Надеюсь, в будущем язык будет более зрелым в этом направлении.