【问题标题】:Typescript implicit types (not implicit any)打字稿隐式类型(不是任何隐式)
【发布时间】:2020-04-04 17:36:19
【问题描述】:

在我从事的一个我无法再访问的 Typescript 项目中,我记得似乎能够执行以下操作:

const fn = string => console.log(string)

作为 Typescript 的新手,它似乎相当于写这个:

const fn = (string:string) => console.log(string)

基本上,在我看来,如果我在函数中以原生类型命名变量,它似乎隐含地被键入为该类型,而不是any

虽然当时我对 Typescript 很陌生,所以完全有可能真的发生了其他事情,我只是误解了这种情况。

现在我正在尝试建立自己的打字稿项目,我想对其进行配置以再次允许该功能。我不知道该怎么做,或者我想的是不是一个真正的 Typescript 功能。

这是 Typescript 中真正的功能吗?

如果是,我该如何配置 Typescript 来做到这一点?

【问题讨论】:

    标签: typescript types implicit-typing


    【解决方案1】:

    在我看来,基本上,如果我在函数中以原生类型命名变量,它似乎隐含地被键入为该类型,而不是any

    这是完全错误的。 Typescript 没有这样的功能。如果您没有提及类型,Typescript 将简单地将其视为any。下面的代码中也发生了同样的事情。

    const fn = string => console.log(string)
    

    string 变量属于any 类型。如果您有一个现代 IDE,如果您将鼠标悬停在它上面,它会向您显示相同的内容。

    要给它一个类型,你必须特别提到一个类型,就像你在后面添加的代码中一样。

    const fn = (string:string) => console.log(string)
    

    这是 Typescript 的真正功能吗?

    如果是,我该如何配置 Typescript 来做到这一点?

    不是这样,因此您无法将其配置为正常工作。

    【讨论】:

      【解决方案2】:

      与您所描述的最接近的功能称为 Contextual TypingType Inference。您可以在TypeScript's documentation for more details 中查找。

      对于您给出的示例,console.log 的标准(节点)定义期望 message 参数为 any 类型的 by。这就是为什么在这种情况下您的 string 参数推断为 any 类型。

      // src: node_modules/@types/node/globals.d.ts
      
      interface Console {
      
          // ...
      
          /**
           * Prints to `stdout` with newline
           */
           log(message?: any, ...optionalParams: any[]): void;
      
          // ...
      }
      

      【讨论】:

      • 我希望我能够访问我从事的旧项目,这让我认为 Typescript 有这个功能。您的答案听起来最接近实际情况,但我想在接受此作为答案之前进行一些测试。
      • 我做了一些测试,当启用noImplicitAny 选项时,上下文输入似乎不起作用。或者至少 VS Code 似乎不接受它。为了确定,我什至直接从文档中粘贴了代码。
      猜你喜欢
      • 2016-03-21
      • 2021-03-29
      • 2017-08-21
      • 2018-11-30
      • 2019-11-11
      • 1970-01-01
      • 2017-05-12
      • 1970-01-01
      相关资源
      最近更新 更多