Як імпортувати js-модулі у файл TypeScript?


82

У мене є проект Protractor, який містить такий файл:

var FriendCard = function (card) {
    var webElement = card;
    var menuButton;
    var serialNumber;

    this.getAsWebElement = function () {
        return webElement;
    };

    this.clickMenuButton = function () {
        menuButton.click();
    };

    this.setSerialNumber = function (numberOfElements) {
        serialNumber = numberOfElements + 1;
        menuButton = element(by.xpath('.//*[@id=\'mCSB_2_container\']/li[' + serialNumber + ']/ng-include/div/div[2]/i'));
    };

    this.deleteFriend = function () {
        element(by.css('[ng-click="deleteFriend(person);"]')).click();
        element(by.css('[ng-click="confirm()"]')).click();
    }
};
module.exports = FriendCard;

Шлях до файлу є ./pages/FriendCard.js.

У мене немає проблем з його імпортом в інший файл за допомогою require():

var FriendCard = require('./../pages/FriendCard');

Отже, я вирішив імпортувати цей файл у файл TypeScript просто так:

import {FriendCard} from './../pages/FriendCard'

Я використовую WebStorm. Це говорить мені, що ( TS2305 ) у нього немає експортованого члена 'FriendCard'.

Можливо, мені доведеться якось налаштувати файл tsconfig.json, але я все ще не знаю, як це працює. Не могли б ви мені допомогти?


1
"Я використовую WebStorm, тому він повідомляє мені, що (TS2305) у нього немає експортованого члена" FriendCard "." Лише невеличка примітка - TS2305означає, що попередження / помилка видається фактичним компілятором / мовною службою TypeScript, а не фактичним WebStorm .. оскільки IDE не використовує таку нумерацію у власних інспекціях / парсерах.
LazyOne

Відповіді:


79

Ви можете імпортувати весь модуль наступним чином:

import * as FriendCard from './../pages/FriendCard';

Детальніше див. У розділі модулів офіційних документів Typescript.


3
Дякуємо, що сформулювали "./" перед фактичним відносним шляхом. Це робить всю різницю в роздільній здатності шляху під час компіляції.
Роман

44
Це оновлено? Я все ще отримую ту саму помилку ... Не вдалося знайти файл декларації для модуля ...
Nathan H

@ НАТАН-ч Ви , ймовірно , потрібно змінити файл TSconfig ... докладніше тут: stackoverflow.com/a/56909179/872328
PaulMest

49

На даний момент я беру кілька застарілих баз коду та вношу мінімальні зміни TypeScript, щоб перевірити, чи це допомагає нашій команді. Залежно від того, наскільки суворо ви хочете бути з TypeScript, це може бути, а може і не підходити вам.

Найбільш корисним способом для нас було розповсюдження нашого tsconfig.jsonфайлу за допомогою цієї властивості:

// tsconfig.json excerpt:

{
  ...

  "allowJs": true,

  ...
}

Ця зміна дозволяє компілювати наші файли JS, які мають підказки типу JSDoc. Також наші IDE (IDE JetBrains та VS Code) можуть забезпечити заповнення коду та Intellisense.

Список літератури:


1
Я поклав всередину compilerOptions `` `Ланг-JS {" compilerOptions ": {...," allowJs ": Справжні} ...}` ``
Матеус Абреу

11

У вашому другому твердженні

import {FriendCard} from './../pages/FriendCard'

ви говорите машинопис, щоб імпортувати клас FriendCard з файлу './pages/FriendCard'

Файл FriendCard експортує змінну, і ця змінна посилається на анонімну функцію.

Тут у вас є два варіанти. Якщо ви хочете зробити це набраним способом, ви можете переформатувати ваш модуль для набору тексту (варіант 1) або ви можете імпортувати анонімну функцію та додати файл d.ts. Див. Https://github.com/Microsoft/TypeScript/issues/3019 . про те, чому вам потрібно додати файл.

Варіант 1

Переформатуйте файл js картки друга, який слід набрати.

export class FriendCard {
webElement: any;
menuButton: any;
serialNumber: any;

constructor(card) {
    this.webElement = card;
    this.menuButton;
    this.serialNumber;
}



getAsWebElement = function () {
    return this.webElement;
};

clickMenuButton = function () {
    this.menuButton.click();
};

setSerialNumber = function (numberOfElements) {
    this.serialNumber = numberOfElements + 1;
    this.menuButton = element(by.xpath('.//*[@id=\'mCSB_2_container\']/li[' + serialNumber + ']/ng-include/div/div[2]/i'));
};

deleteFriend = function () {
    element(by.css('[ng-click="deleteFriend(person);"]')).click();
    element(by.css('[ng-click="confirm()"]')).click();
}
};

Варіант 2

Ви можете імпортувати анонімну функцію

 import * as FriendCard from module("./FriendCardJs");

Існує кілька варіантів визначення файлу d.ts. Ця відповідь видається найбільш повною: Як створити файл визначення .d.ts "типізації" з існуючої бібліотеки JavaScript?


2

Я протестував 3 методи для цього ...

Метод 1:

      const FriendCard:any = require('./../pages/FriendCard')

Спосіб 2:

      import * as FriendCard from './../pages/FriendCard';

Метод 3:

якщо ви можете знайти щось подібне у tsconfig.json:

      { "compilerOptions": { ..., "allowJs": true }

тоді ви можете написати: import FriendCard from './../pages/FriendCard';


1

Я стикаюся з цією проблемою довго, але що це вирішує мою проблему Зайдіть всередину tsconfig.json і додайте наступне в compilerOptions

{
  "compilerOptions": {
      ...
      "allowJs": true
      ...
  }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.