簡體   English   中英

在類型轉換為TypeScript的變量上調用`new`

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM