4

是否有任何方法可以在TypeScript中引用推斷類型?在TypeScript中引用推斷類型

在下面的例子中,我們得到很好的推斷類型。

function Test() { 
    return {hello:"world"} 
} 

var test = Test() 
test.hello // works 
test.bob // 'bob' doesn't exist on inferred type 

但是,如果我想定義一個函數,它的類型的參數是什麼:「無論Test回報」,但沒有明確定義的界面?

function Thing(test:???) { 
    test.hello // works 
    test.bob // I want this to fail 
} 

這是一種解決方法,但它得到毛茸茸的,如果測試有其自身的參數。

function Thing(test = Test()) {} // thanks default parameter! 

是否有某種方法來引用任何測試返回的推斷類型?因此,我可以輸入「無論測試返回」的東西,而無需創建界面?

我關心的原因是我通常使用閉包/模塊模式而不是類。儘管您可以創建一個描述該類的接口,但Typescript已經可以讓您將類型輸入爲類。我想輸入一些東西,無論函數返回什麼而不是一個類。有關更多信息,請參閱Closures in Typescript (Dependency Injection)

解決此問題的最佳方法是如果TypeScript添加了abilty來定義將其依賴關係作爲參數的模塊,或者在閉包中定義模塊。然後我可以使用漂亮的export語法。任何人都知道是否有這樣的計劃?

回答

1

你可以用一個接口的身體作爲一種文字:

function Thing(test: { hello: string; }) { 
    test.hello // works 
    test.bob // I want this to fail 
} 

相當於

interface ITest { 
    hello: string; 
} 

function Thing(test: ITest) { 
    test.hello // works 
    test.bob // I want this to fail 
} 

只是不要忘了;在每個成員的結束。


沒有用於命名或引用推斷類型的語法。您可以得到的最接近的是爲將要使用的成員使用接口或類型文字。接口和類型文字將匹配至少有定義成員的任何類型。 「鴨子打字」

+0

我想要的主要事情是將'test'輸入爲「無論'測試'返回」,而不必定義類型 –

+1

因此您不能,因此稱爲「匿名類型」 - 它不能被命名(技術上,當你輸入一個類型文字時,你正在輸入一個與另一個匿名類型具有相同形狀的新匿名類型)。 –