Как получить тип класса в typescript?

Есть класс:

class Test {
  ...
}

Как получить его тип в другом файле?

Пробовал:

1)

export type { Test };
type testType = typeof Test;
export type {testType};

Хочу сделать первым вариантом. Что-то работать не хочет. Со вторым получается, но не "оверхед" ли это?


Ответы (1 шт):

Автор решения: Alexander Lonberg

Если конструктор передается в параметры, воспользуйтесь синтаксисом интерфейса

// Предположим у нас универсальный класс
class Foo<T extends string> {
  static bar: 1 | 2 | 3 = 1
  p: T
  constructor(p: T) {
    this.p = p
  }
  getData(): T {
    return this.p
  }
}

// Объявляем конструктор
interface FooConstructor<T extends string> {
  // Тут же можем объявить статические свойства
  bar: 1 | 2 | 3
  new(p: T): Foo<T>
}

// Используем
function someWithConstructor(c: FooConstructor<'foo' | 'bar'>): void {
  // Здесь имеем доступ к статическим свойствам
  const n = c.bar // 1 | 2 | 3
  const instance = new c('foo')
  const data = instance.getData() // return: "foo" | "bar"
}

// А эти варианты смотрите в Playground
function someWithoutConstructor_0(c: typeof Foo<'foo'|'bar'>)): void {
  // Error
}
function someWithoutConstructor_1(c: typeof (Foo<'foo' | 'bar'>)): void {
  // Error
}
function someWithoutConstructor_2(c: (typeof Foo)<'foo'|'bar'>): void {
  // Error
}

Playground

Возможно и есть вариант использовать typeof, но я не встречал это в файлах lib.*.d.ts. Смотрите, к примеру, как объявлены конструкторы в "node_modules/typescript/lib/lib.es5.d.ts" для String, строка 517.

→ Ссылка