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

因此您不能,因此称为“匿名类型” - 它不能被命名(技术上,当你输入一个类型文字时,你正在输入一个与另一个匿名类型具有相同形状的新匿名类型)。 –