【问题标题】:Reference an inferred type in TypeScript在 TypeScript 中引用推断类型
【发布时间】:2012-11-26 00:27:49
【问题描述】:

有没有办法在 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 返回的推断类型吗?所以我可以在不创建界面的情况下输入“Whatever Test returns”之类的内容?

我关心的原因是因为我通常使用闭包/模块模式而不是类。 Typescript 已经允许您将某些内容作为类输入,即使您可以创建一个描述该类的接口。我想输入函数返回的东西而不是类。有关原因的更多信息,请参阅Closures in Typescript (Dependency Injection)

解决这个问题的最佳方法是,如果 TypeScript 添加了定义将依赖项作为参数的模块的能力,或者在闭包内定义模块。然后我可以使用漂亮的export 语法。有人知道有没有这方面的计划?

【问题讨论】:

    标签: javascript dependency-injection closures typescript inferred-type


    【解决方案1】:

    现在可以了:

    function Test() {
        return { hello: "world" }
    }
    
    function Thing(test: ReturnType<typeof Test>) {
      test.hello // works
      test.bob   // fails
    }
    

    https://www.typescriptlang.org/docs/handbook/advanced-types.html#type-inference-in-conditional-types

    【讨论】:

      【解决方案2】:

      您可以将接口的主体用作类型文字:

      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 返回什么”,而不必定义类型
      • 你不能,因此术语“匿名类型” - 它不能被命名(从技术上讲,当你输入一个类型文字时,你正在输入一个新的匿名类型,它的形状与另一种匿名类型)。
      猜你喜欢
      • 2018-07-03
      • 2020-01-27
      • 1970-01-01
      • 2019-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-09
      • 2017-10-04
      相关资源
      最近更新 更多