[英]Call `new` on a variable cast to a type in TypeScript
我正在編寫一些單元測試,並且想測試我的構造函數在運行時是否使用無效參數失敗。 如果在TS項目中使用無效參數調用了構造函數,則該構造函數將在編譯時失敗,因此我首先必須將其強制轉換為any
。
my-class.ts
export default class MyClass {
constructor(public value: 1 | 2 | 3) {
if (!this.value ||
isNaN(this.value) ||
this.value < 1 || this.value > 3 ||
parseInt(this.value) !== this.value) {
throw new Error(`Invalid value: '${this.value}'`);
}
}
}
my-class.test.ts
test('MyClass validates its constructor arguments', () => {
expect(() => new (MyClass as any)()).toThrowErrorMatchingSnapshot();
expect(() => new (MyClass as any)('abc')).toThrowErrorMatchingSnapshot();
expect(() => new (MyClass as any)(null)).toThrowErrorMatchingSnapshot();
// ...
});
我想清理這一點,因此我只能通過設置局部變量來進行一次強制轉換。
test('MyClass validates its constructor arguments', () => {
// this type declaration isn't right
const MC = MyClass as any as { new: (...args: any[]) => MyClass };
expect(() => new MC()).toThrowErrorMatchingSnapshot();
expect(() => new MC('abc')).toThrowErrorMatchingSnapshot();
expect(() => new MC(null)).toThrowErrorMatchingSnapshot();
// ...
});
我模糊地記得寫過一個泛型,該泛型的類型參數需要一個類,並且我想這就是我的寫法-一個具有名為new
的函數的對象,但是現在我找不到在網上找到的對象,並且我什至不記得我最初寫的是哪個項目。
無論如何,TypeScript用此代碼對我大吼:
ts(2351)無法將'new'用於其類型缺少調用或構造簽名的表達式
我還嘗試將{ new: ... }
更改為{ constructor: ... }
,結果相同。
我可以將MC
保留為any
適合單元測試的條件,但是我想知道將來如何做。
test('MyClass validates its constructor arguments', () => {
type Constructor<T> = new (...args: any[]) => T;
const MC = MyClass as Constructor<MyClass>;
expect(() => new MC()).toThrowErrorMatchingSnapshot();
expect(() => new MC('abc')).toThrowErrorMatchingSnapshot();
expect(() => new MC(null)).toThrowErrorMatchingSnapshot();
// ...
});
也可以內聯執行此操作,盡管使用解釋變量似乎更清楚。
const MC = MyClass as new (...args: any[]) => MyClass;
原來我很近。 TypeScript作者為這種聲明選擇了一種奇怪的語法,但是我不能坦白地說我可以提出更好的建議。
const MC = MyClass as any as new(...args[]: any[]) => MyClass;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.