2017-08-11 80 views
0

我想知道爲什麼類型typeof Tnew() => T不兼容。考慮一個getConstructor<T>功能:TypeScript:typeof T不兼容{new():T}

function getConstructor<T>(instance: T) 
{ 
    return instance.constructor as new() => T; 
} 

let instance = new MyClass(); 
let x: typeof MyClass; 
let y = getConstructor(instance); 
x = y; // type error 

的錯誤狀態:類型new() => MyClass是不能分配給類型typeof MyClass。這可能是因爲我的MyClass有一些靜態函數在new() => MyClass中丟失。

因此,一個解決方案是使用typeof T

function getConstructor<T>(instance: T) 
{ 
    return instance.constructor as typeof T; // type error 
} 

然而,這給了我另一種類型的錯誤:T僅是指一類,但被用作這裏的值。

打字稿語言規範中4.18.6節規定: 在位置處一個類型的預期,「的typeof」也可以在一種類型的查詢中使用的[...],以產生 表達式的類型。

那麼爲什麼會出現上述類型的錯誤呢?無論如何,有什麼辦法可以做到這一點?

+0

你能分享一個指向TypeScript Playground第一個例子的基本代碼的鏈接嗎? http://www.typescriptlang.org/play/ –

回答

1

你的困惑的事實,MyClass(只打字稿知道,在運行時被擦除)的名字,同時也是一個(這是存在於JavaScript對象的名字的詞幹運行)。 類型MyClass適用於該類的實例,而MyClass是一個構造函數。

TypeScript允許您使用typeof運算符查詢的類型。所以,typeof MyClass指的是MyClass的構造函數的類型。您無法查詢類型的類型,因此,例如,typeof string是錯誤的(除非巧合地命名爲string)。所以你不能做typeof T其中T是某種類型。


我還沒有找到一個偉大的方式給你想要的東西。 TypeScript不知道如何從實例中推斷出constructor屬性的確切類型。它只是認爲它是Function。我能做的最好的事情是明確標記類聲明爲正確類型的constructor。像這樣:

interface Constructable<T, C extends Constructor<T>> { 
    "constructor": C 
} 

class MyClass implements Constructable<MyClass, typeof MyClass> { 
    "constructor" = MyClass; 
    // static methods, etc; 
} 

function getConstructor<C extends Constructor<{}>>(instance: Constructable<{},C>) 
{ 
    return instance.constructor; 
} 

let instance = new MyClass(); 
let x: typeof MyClass; 
let y = getConstructor(instance); 
x = y; // no error 

不知道你是否可以爲你的課程做到這一點。希望有所幫助。祝你好運!

相關問題