網站搜尋

TypeScript 透過使用者定義的型別守衛檢查實例類別


好吧,我已經實現了 isInstanceOfClass 函數,它可以判斷該實例是否為給定類的實例,現在我需要為它編寫正確的類型定義。

class Parent {
    isInstanceOfClass<T>(arg: T): this is T {
        // already implemented
    }
}

class FooClass extends Parent {
    foo: number;
}

class BarClass extends Parent {
    bar: number;
}

範例:

let foo: Parent;
if(foo.isInstanceOfClass(FooClass)) {
    foo.foo = 1; // TS2339: Property 'foo' does not exist on type 'Parent & typeof FooClass'.
}

有人可以幫我解決這個錯誤嗎?

由於各種原因,我只能更改 isInstanceOfClass 方法的簽名,而不能更改範例代碼。

答案#1

你快到了!
應該是:

class Parent {
    isInstanceOfClass<T>(arg: { new(): T }): this is T {
        // already implemented
    }
}

差別在於你傳遞給 isInstanceOfClass 的不是實例,而是類別。
一旦你將其改為類別(建構函數),錯誤就會消失。