@types 和 typescript 类型解析

@types and typescript type resolving

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

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

无论我尝试什么,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 没有给我正确的见解?

谢谢 约翰.

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

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

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

看看这个:

编辑 -- 解决方案 1

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

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

好的,所以我基本上创建了一个@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

在这些索引类型文件中,我引用了从存储库 (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) {
  }
}

现在可以了...