Как вызвать метод класса, не создавая его экземпляры? - PullRequest
0 голосов
/ 13 января 2019

Я создал класс Tools для расширения каждого класса из него, так как он содержит набор функций, которые использует весь класс.

Я экспортирую свой класс так:

Tools.ts

export abstract class Tools {
  getRandom(bytes) {
    return 21 // Example
  }
}

Main.ts

import * as Tools from './Tools.ts'

class Main extends Tools { // <-- I get the error from the Tools keyword here
  constructor() {
    super() // If not, I get an error
  }

  token() { // Example method
    this.getRandom(2)
  }
}

Я получаю ошибку:

Type 'typeof import("[...]/tools")' is not a constructor function type

Я не хочу использовать new Tools() в каждом классе, я бы хотел вызвать функцию класса напрямую.

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

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Хотя ваша проблема была решена ранее, я хочу присоединиться к ней, поскольку я думаю, что вы хотите достичь чего-то, что семантически отличается от расширения класса. Хранение служебных функций в классе Tools и расширение его предотвратит дальнейшее наследование. Кроме того, вы можете захотеть использовать только одну служебную функцию, но все же наследовать ВСЕ из них, что было бы ужасно в случае lodash.

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

// In Tools.ts
export class Tools {
    // https://xkcd.com/221/
    public static getRandomNumber() {
        return 4; // chosen by fair dice roll.
                  // guaranteed to be random. 
    }
}

// Somewhere else
import { Tools } from "./Tools";

export class Main {
    public doSomething() {
        const randomNumber = Tools.getRandomNumber();
    }
}

Однако в TypeScript обычно не рекомендуется экспортировать классы, которые состоят только из статических методов, и эти методы должны быть инкапсулированы в свои собственные функции, которые вы можете явно импортировать для уменьшения размера пакета:

// In Tools.ts
export function getRandomNumber() {
    // https://xkcd.com/221/
    return 4; // chosen by fair dice roll.
              // guaranteed to be random. 
}

// Somewhere else
import { getRandomNumber } from "./Tools";

export class Main {
    public doSomething() {
        const randomNumber = getRandomNumber();
    }
}
0 голосов
/ 13 января 2019

Вы используете с именем export , поэтому ваш оператор импорта должен выглядеть следующим образом:

import { Tools } from './Tools.ts'

Если вам не нравится явный вызов super, вы можете пропустить constructor. В этом случае JavaScript во время выполнения вызовет его для вас.

class Main extends Tools {
  token() {
    this.getRandom(2)
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...