如何将js-modules导入TypeScript文件?

San*_*rog 52 javascript webstorm typescript protractor

我有一个包含这样一个文件的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;
Run Code Online (Sandbox Code Playgroud)

该文件的路径是

./pages/FriendCard.js

我没有问题,使用require()方法导入到另一个文件:

var FriendCard = require('./../pages/FriendCard');
Run Code Online (Sandbox Code Playgroud)

所以,我决定将这个文件导入到TypeScript文件中:

import {FriendCard} from './../pages/FriendCard'
Run Code Online (Sandbox Code Playgroud)

我正在使用WebStorm,所以它告诉我,(TS2305)它没有导出成员'FriendCard'.

也许我必须以某种方式配置tsconfig.json文件,但我仍然不知道它是如何工作的.你可以帮帮我吗?

Ram*_*ala 56

您可以按如下方式导入整个模块:

import * as FriendCard from './../pages/FriendCard';
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅Typescript官方文档的模块部分.

  • 这是最新的吗?我仍然收到相同的错误...无法找到模块的声明文件... (12认同)
  • @nathan-h您可能需要修改 tsconfig 文件...更多信息在这里:/sf/answers/3983642561/ (4认同)
  • 感谢您在实际相对路径前面清楚地表达“ ./”。这使得编译时路径分辨率的所有差异。 (3认同)

Pau*_*est 13

我目前正在使用一些旧的代码库,并介绍TypeScript的最小更改,以了解它是否对我们的团队有所帮助。根据您对TypeScript的严格要求,这可能是您的选择,也可能不是。

对于我们而言,最有用的方法是tsconfig.json使用以下属性扩展文件:

// tsconfig.json excerpt:

{
  ...

  "allowJs": true,

  ...
}
Run Code Online (Sandbox Code Playgroud)

此更改使具有JSDoc类型提示的JS文件得以编译。同样,我们的IDE(JetBrains IDE和VS Code)也可以提供代码完成和Intellisense。

TypeScript编译器选项

  • 我已经放入 **compilerOptions** ``` lang-js { "compilerOptions": { ..., "allowJs": true } ... } ``` (2认同)

Pet*_*ger 9

在你的第二个陈述中

import {FriendCard} from './../pages/FriendCard'
Run Code Online (Sandbox Code Playgroud)

您正在告诉打字稿从文件“ ./pages/FriendCard” 导入FriendCard

您的FriendCard文件正在导出一个变量,并且该变量引用了匿名函数。

您在这里有两个选择。如果要以键入方式执行此操作,则可以重构要键入的模块(选项1),也可以导入匿名函数并添加d.ts文件。有关更多详细信息,请参见https://github.com/Microsoft/TypeScript/issues/3019。关于为什么需要添加文件的信息。

选项1

重构要输入的Friend card 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();
}
};
Run Code Online (Sandbox Code Playgroud)

选项2

您可以导入匿名函数

 import * as FriendCard from module("./FriendCardJs");
Run Code Online (Sandbox Code Playgroud)

d.ts文件定义有几个选项。这个答案似乎是最完整的:如何从现有的JavaScript库中生成.d.ts“类型”定义文件?


sin*_*ina 9

我测试了 3 种方法来做到这一点......

方法一:

      const FriendCard:any = require('./../pages/FriendCard')
Run Code Online (Sandbox Code Playgroud)

方法二:

      import * as FriendCard from './../pages/FriendCard';
Run Code Online (Sandbox Code Playgroud)

方法三:

如果你可以在 tsconfig.json 中找到类似的内容:

      { "compilerOptions": { ..., "allowJs": true }
Run Code Online (Sandbox Code Playgroud)

那么你可以写: import FriendCard from './../pages/FriendCard';


Ben*_*ing 8

2021 解决方案

如果您仍然收到此错误消息:

TS7016: Could not find a declaration file for module './myjsfile'
Run Code Online (Sandbox Code Playgroud)

那么您可能需要将以下内容添加到 tsconfig.json

TS7016: Could not find a declaration file for module './myjsfile'
Run Code Online (Sandbox Code Playgroud)

这可以防止 typescript 尝试将模块类型应用于导入的 javascript。