【问题标题】:@types and typescript type resolving@types 和 typescript 类型解析
【发布时间】:2018-07-11 16:11:27
【问题描述】:

我有一个项目,其中包含 polymer@next 作为纱线模块,将其添加为纯 JS 库。我想使用来自聚合物 2.4 github repo 的 types 文件夹中的类型:https://github.com/Polymer/polymer/tree/2.4-pre/types

所以我开始创建一个 @types 文件夹并在其中添加一个 @polymer 文件夹,其中包含 package.json 和 index.d.ts 以及来自 repo 的所有文件。

无论我尝试什么,tsc 都找不到并接受聚合物元素类型。它在@types 文件夹中作为聚合物中的文件...

我的@typings 的结构包含:

+ @types
++++ @polymer
------ package.json
------ index.d.ts
------ polymer-element.d.ts

我的代码 (app.ts) 包含: 从'@polymer/polymer/polymer-element'导入{元素}

我也尝试将“polymer-element.d.ts”放在“polymer”子文件夹中,但这也会产生同样的错误:

 src/myapp.ts(3,25): error TS7016: Could not find a declaration file for 
    module '@polymer/polymer/polymer-element'. 
 '/Users/johngorter/Desktop/polymernext/node_modules/@polymer/polymer/polymer-element.js' implicitly has an 'any' type.
  Try `npm install @types/@polymer/polymer/polymer-element` if it exists or add a new declaration (.d.ts) file containing `declare module '@polymer/polymer/polymer-element';`

我在这里缺少什么?为什么 tsc --traceResolution 没有给我正确的见解?

谢谢 约翰。

【问题讨论】:

    标签: typescript typescript-typings yarnpkg tsc


    【解决方案1】:

    好的,所以我基本上为每个导入的命名模块创建了一个@types 文件夹:

    import '@polymer/polymer/polymer'
    import { Element } '@polymer/polymer/polymer-element'
    

    我直接在@types文件夹下创建了一个子文件夹,每个子文件夹都包含一个index.d.ts文件,所以结构是:

    @types
     ----@polymer
     --------index.d.ts
     ----@polymer-element
     --------index.d.ts
    

    在这些索引类型文件中,我引用了从 repo (polymer 2.4) 下载的类型定义,并创建了一个命名模块定义,如下所示:

    declare module "@polymer/polymer/polymer-element" {
    
      /**
       * Base class that provides the core API for Polymer's meta-programming
       * features including template stamping, data-binding, attribute deserialization,
       * and property change observation.
       */
      class Element extends
        Polymer.ElementMixin(
        HTMLElement) {
      }
    }
    

    现在可以了……

    【讨论】:

      【解决方案2】:

      正如@Polymer 定义的那样,它是一个命名空间并且(如我所见)没有export 成员,因此请尝试以下解决方法:

      import polymerElement = require('@polymer/polymer/polymer-element');

      如果它不起作用,请尝试仅使用 @polymer /lib 路径中的一种类型,看看它是否至少可以解决该问题。

      看看这个:New es6 syntax for importing commonjs / amd modules i.e. `import foo = require('foo')`

      编辑 -- 解决方案 1

      implicitly has an 'any' type 错误应该可以通过更改您的 tsconfig 文件来解决:

      { "compilerOptions": 
      { "target": "es5", 
      "module": "commonjs", 
      "moduleResolution": "node", 
      "sourceMap": true, 
      "emitDecoratorMetadata": true, 
      "experimentalDecorators": true, 
      "removeComments": false, 
      "noImplicitAny": false // <----- 
      }

      【讨论】:

      • 同样的错误,它没有拾取polymer-element.d.ts,这里是错误:错误TS7016:找不到模块'@polymer/polymer/polymer-element的声明文件'。 '/Users/johngorter/Desktop/polymernext/node_modules/@polymer/polymer/polymer-element.js' 隐含了一个 'any' 类型。
      • first: implicitly has an 'any' type 应该解决改变你的 tsconfig 文件: { "compilerOptions": { "target": "es5", "module": "commonjs", "moduleResolution": "node" , "sourceMap": true, "emitDecoratorMetadata": true, "experimentalDecorators": true, "removeComments": false, "noImplicitAny": false //
      • 我不想使用implicitAny,我希望输入元素所以它不是任何...更改 tsconfig 会消除错误,但我会隐含任何...跨度>
      • 您要输入的元素来自您的库,类型为 any。我认为您必须直接更改它,或者尝试在 gitHub 项目上打开一个问题。我将为第一个解决方案编辑我的答案 =)
      • "您要输入的元素来自您的库,具有任何类型。"我不明白..'@polymer/polymer/polymer-element'来自聚合物模块,我只想使用它并支持打字稿..我自己在@types 文件夹中创建了一个polymer-element.d.ts 文件将类型信息添加到此模块,但它不会被拾取,因此它被隐式键入为“任何”。在我添加的类型文件 (polymer-element.d.ts) 中,我明确地将其键入为 any,因此这不应触发错误。错误表明找不到类型文件...
      猜你喜欢
      • 2016-12-29
      • 2017-04-10
      • 2019-03-02
      • 2016-09-29
      • 2019-01-03
      • 2017-02-01
      • 2020-04-10
      • 1970-01-01
      • 2017-12-04
      相关资源
      最近更新 更多