不能使用ES2015或laterclass
讓你調用構造函數沒有new
關鍵字。在鏈接文檔的第9.2.1節的第2步中,調用沒有new
關鍵字的類構造函數應導致引發TypeError
。 (如果你在TypeScript中定位ES5,你會得到一些在運行時可以工作的東西,但是如果你的目標是ES2015或者更高版本,你將會得到運行時錯誤,所以最好不要這樣做。)所以要實現你的接口,你需要使用pre -ES2015構造函數代替。
順便說一下,new(arg: number)
簽名需要返回類型。例如:
interface A {
(): string;
new(arg: number): AInstance; // return something
GetValue(): number;
}
// define the instance type
interface AInstance {
instanceMethod(): void;
}
下面是實現的一個方法。首先,做一個class
爲AInstance
:
class _A implements AInstance {
constructor(arg: number) { } // implement
instanceMethod() { } // implement
}
然後,做一個可以帶或不帶new
調用的函數:
const AFunctionLike =
function(arg?: number): AInstance | string {
if (typeof arg !== "undefined") {
return new _A(arg);
}
return "string";
} as { new(arg: number): AInstance,(): string };
我已經決定,如果調用AFunctionLike
與參數,那麼你將獲得AInstance
,否則您將獲得string
。如果您的運行時支持它,您還可以通過new.target明確檢查是否使用了new
。
另外請注意,我不得不斷言AFunctionLike
是newable(與最後一行as
條款),因爲目前尚未有其他的方式來告訴打字稿是一個獨立的函數可以用new
被調用。我們差不多完成了。
const A: A = Object.assign(
AFunctionLike,
{
GetValue() {
return 1;
}
}
);
值A
已經通過使用實現GetValue()
對象合併AFunctionLike
形成:我們可以如下聲明A
類型的值。您可以使用Object.assign
或spread syntax進行合併。
就是這樣。你可以驗證這在運行時on the TypeScript Playground。祝你好運!