Как указать любой новый тип в 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
тип соответствует параметрам функции. В противном случае это приведет к неожиданным ошибкам.