在 TypeScript 中如何引用一个推断类型

7
有没有办法在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
}

这是一个解决方法,但如果Test有自己的参数,情况会变得复杂。
function Thing(test = Test()) {} // thanks default parameter!

有没有一种方法可以引用Test返回的推断类型?这样我就可以将某些内容作为“Test返回的东西”进行类型标记,而不需要制定一个接口。
我的关注点在于,通常我使用闭包/模块模式而不是类。TypeScript已经允许您将某些内容标记为类,即使您可以创建描述该类的接口。我希望将某些内容标记为函数返回的任何内容,而不是一个类。请参见有关此问题的更多信息:Typescript中的闭包(依赖注入)
最好的解决方法是如果TypeScript添加了定义以参数形式获取其依赖项的模块的能力,或者在闭包内定义模块。那么我只需使用漂亮的export语法即可。是否有人知道是否有计划实现这个功能?
2个回答

6

0

你可以使用接口的主体作为类型文字:

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
}

只要不要忘记在每个成员的末尾加上;


没有为推断类型命名或引用提供语法。最接近的方法是使用接口或类型字面量来表示您要使用的成员。接口和类型字面量将匹配至少具有定义成员的任何类型。"鸭子类型"


我想要的主要是将test键入为“无论Test返回什么”,而不必定义类型。 - Sean Clark Hess
1
你不能给它命名,因此称之为“匿名类型” - 它无法被命名(从技术上讲,当您键入类型文字时,您正在键入一个具有与其他匿名类型相同形状的新匿名类型)。 - Ryan Cavanaugh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接