Как указать любой новый тип в TypeScript?

Я пытался с этим, но это не работает. Фу это просто проверка того, что работает. Бар - это реальная попытка, он должен получать любой новый тип, но подклассы объекта недопустимы для этой цели.

class A {

}
class B {
    public Foo(newable: typeof A):void {

    }
    public Bar(newable: typeof Object):void {

    }
}

var b = new B();
b.Foo(A);
b.Bar(A); // <- error here

3 ответа

Решение

Ты можешь использовать { new(...args: any[]): any; } разрешить любой объект с конструктором с любыми аргументами.

class A {

}

class B {
    public Foo(newable: typeof A):void {

    }

    public Bar(newable: { new(...args: any[]): any; }):void {

    }
}

var b = new B();
b.Foo(A);
b.Bar(A);  // no error
b.Bar({}); // error

Если вы хотите применить только определенные новые объекты, вы можете указать тип возвращаемого конструктора

interface Newable {
  errorConstructor: new(...args: any) => Error; // <- put here whatever Base Class you want
}

эквивалент

declare class AnyError extends Error { // <- put here whatever Base Class you want
  // constructor(...args: any) // you can reuse or override Base Class' contructor signature
}

interface Newable {
  errorConstructor: typeof AnyError;
}

тестирование

class NotError {}
class MyError extends Error {}

const errorCreator1: Newable = {
  errorConstructor: NotError, // Type 'typeof NotError' is missing the following properties from type 'typeof AnyError': captureStackTrace, stackTraceLimitts
};

const errorCreator2: Newable = {
  errorConstructor: MyError, // OK
};

ИспользуяConstruct Signatureособенность TypeScript, вы можете создать новую функцию.

      /*
* Create a newable function
*/

type Vector2D = {
  x: number
  y: number
}

type Vector2DConstructor = {
  new(x: number, y: number): Vector2D
  (x:number, y: number): Vector2D
}

const Vector2D = function (this: Vector2D, x: number, y: number): Vector2D {
  if (x < 3) throw new Error('x cannot be smaller than 3')
  if (!new.target) {
    return {x, y}
  }
  this.x = x
  this.y = y
  return this
} as Vector2DConstructor // without type casting, it won't work

const a = new Vector2D(3, 3)
console.log(a)

Вы можете попробовать это на детской площадке .

В этом есть некоторые недостатки:

  • Вы должны использовать приведение типов, что небезопасно для проверки ошибок.
  • Вы должны убедиться, что параметрыConstructorтип соответствует параметрам функции. В противном случае это приведет к неожиданным ошибкам.
Другие вопросы по тегам