@types и разрешение типов typescript

У меня есть проект, который содержит полимер @next в качестве модуля пряжи, я добавил его как чистую библиотеку JS. Я хотел использовать типизацию из папки типов из репозитория полимера 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) содержит: import { Element } from '@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 не дает мне правильных сведений?

Спасибо, Джон.


person John Gorter    schedule 01.02.2018    source источник


Ответы (2)


Итак, я в основном создал папку @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) {
  }
}

Теперь это работает...

person John Gorter    schedule 01.02.2018

Поскольку @Polymer определен, это пространство имен и (как я вижу) не имеет членов export, поэтому попробуйте этот обходной путь:

import полимерный элемент = require('@polymer/polymer/polymer-element');

если это не сработает, попробуйте только один тип из пути @polymer /lib и посмотрите, решит ли он хотя бы для этого.

взгляните на это: «> Новый синтаксис es6 для импорта модулей commonjs/amd, т. е. `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 // <----- 
}

person Luca Taccagni    schedule 01.02.2018
comment
та же ошибка, не подхватывает полимер-элемент.d.ts, вот ошибка: ошибка TS7016: не удалось найти файл декларации для модуля '@polymer/polymer/polymer-element'. «/Users/johngorter/Desktop/polymernext/node_modules/@polymer/polymer/polymer-element.js» неявно имеет тип «любой». - person John Gorter; 01.02.2018
comment
сначала: implicitly has an 'any' type следует решить, изменив файл tsconfig: {compileOptions: { target: es5, module: commonjs, moduleResolution: node, sourceMap: true, emitDecoratorMetadata: true, ExperimentDecorators: true, removeComments: false, "noImplicitAny": false // ‹--- -- }, - person Luca Taccagni; 01.02.2018
comment
Я не хочу иметь implicitAny, я хочу, чтобы Element был типизирован, поэтому он не является any... Изменение tsconfig удаляет ошибку, но тогда у меня будет неявное any... - person John Gorter; 01.02.2018
comment
элемент, который вы хотите ввести, взят из вашей библиотеки с типом any. Я думаю, вам придется изменить это напрямую или просто попробовать открыть проблему в проекте gitHub. Я отредактирую свой ответ для первого решения =) - person Luca Taccagni; 01.02.2018
comment
элемент, который вы хотите ввести, взят из вашей библиотеки с любым типом. Я не понимаю.. '@polymer/polymer/polymer-element' исходит из модуля полимера, я просто хочу использовать его и иметь поддержку машинописного текста.. Я сам создал файл полимер-элемент.d.ts внутри папки @types чтобы добавить информацию о типе в этот модуль, но она не подхватывается, поэтому неявно типизируется как «Любой». В моем добавленном файле типа (polymer-element.d.ts) я явно ввожу его как любой, поэтому это не должно вызывать ошибку. Ошибка указывает, что файл типа не найден... - person John Gorter; 01.02.2018