2017-09-22 160 views
0

說我有以下打字稿代碼:聲明類/關閉

export const makeMyClass = function(a: string, b: boolean){ 

    const MyClass = function(){ 

    }; 

    MyClass.prototype.foo = function(){}; 

    MyClass.prototype.bar = function(){}; 

    return MyClass; 

} 

我有麻煩搞清楚如何將代碼轉換的出口工廠函數內部爲打字稿。

例如,如果我這樣做:

export const makeMyClass = function(a: string, b: boolean): MyClass { 

     class MyClass { 

     } 

     // ... 

     return MyClass; 


    } 

打字稿笙歌說,它無法找到名爲「MyClass的」。爲了這個問題,請假設我需要使用導出的關閉。

+1

我認爲唯一可以使用的解決方案是在類實現的外部作用域中聲明一個接口,然後返回該接口的構造函數。你能否充實一下MyClass的實現,以便告訴你我的意思? – jcalz

+0

我不想爲這個問題添加任何無關的細節,這隻會讓人們很難知道我在問什麼。我想我知道你在說什麼,所以如果你不介意添加一個答案,我會upvote。 –

回答

1

如果您想給出一個名稱,該名稱的返回值的類型爲makeMyClass(),它在該函數之外是可見的,那麼您必須將其結構描述爲外部範圍中的一種接口。至少這就是我理解TypeScript的implementationclass expressions

下面是我會如何做你的情況。一個類的實例類型(描述實例屬性和類方法)和構造型(描述構造和任何靜態方法),所以我們需要同時描述:

export interface MyClassInstance { 
    foo(): void; 
    bar(): void; 
    // define the rest of the public interface here 
} 
export interface MyClassConstructor { 
    new(): MyClassInstance; 
    readonly prototype: MyClassInstance; 
    // define any static methods here 
} 

現在你可以聲明makeMyClass()返回構造方法類型:

export const makeMyClass = function(a: string, b: boolean): MyClassConstructor { 

    // implement the MyClassInstance/MyClassConstructor interfaces 
    class MyClass { 
    foo() { 
     // ... 
    } 
    bar() { 
     // ... 
    } 
    } 

    return MyClass; 
} 

請注意,這是重複的,因爲您在函數內部和外部都聲明瞭類結構。如果向接口添加屬性或方法,則需要將相應的屬性添加到類實現中。這似乎是不可避免的,因爲你不能從函數內部導出類型。

無論如何,希望有所幫助;祝你好運!

+0

謝謝,是的,我可能會把這個問題發送給DefinitelyTyped的愛好者,因爲這看起來像是一個常見問題。 –

+0

感謝您的回答,您可能也可以回答這個問題嗎? https://stackoverflow.com/questions/46639573/create-prototype-function-with-different-scope-not-an-inline-function –

+0

我想在你的答案這裏,MyClass需要顯式擴展或實現MyClassConstructor? –