#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. Спасибо, это очень полезно. Я предположил, что это так, но надеялся, что есть способ описать это без недостатков. Надеюсь, в будущем язык будет более зрелым в этом направлении.