【问题标题】:Typescript: Ignore implicitly any type when importing js module打字稿:导入js模块时隐式忽略任何类型
【发布时间】:2017-05-12 13:56:24
【问题描述】:

在 Typescript 项目中,我需要导入一些旧的 js 文件,这些文件在自身内部执行 module.exports。

当我导入时:

import * as httpConnection from '...path...';

我从编译器收到错误:

Could not find a declaration file for module '...path...'. '...path...' implicitly has an 'any' type.

之后它工作正常,但我需要在控制台中避免这个错误。

如何在不创建声明文件的情况下让编译器理解 import 具有任何类型?

提前感谢您的想法。

【问题讨论】:

标签: typescript


【解决方案1】:

这意味着您应该键入此模块。 Typescript 不满意这个模块隐含地没有任何定义文件。

如果它是一个外部公共模块,您可能只能使用 npm install @types/name_of_the_module 安装它的类型

(现在有些模块甚至在 lib 中有它们的定义文件。所以只需 npm 安装模块即可为您提供 .d.ts 定义。但这里可能并非如此)

如果它是私有代码或者您找不到它,您可以在它旁边添加一个.d.ts 文件,理想情况下它可以键入它的所有功能。如果您愿意因为没有时间而牺牲打字,您可以在模块上使用明确的any 类型,并使用以下.d.ts

declare var name_of_the_module: any;

declare module "name_of_the_module" {
    export = name_of_the_module;
}

编辑:

正如@stsloth 所指出的,对于 Typescript 2.6,您也可以通过在导入上方添加行 // @ts-ignore来完全忽略该错误。

【讨论】:

  • 作为补充。对于没有发布类型的公共模块,一种解决方法可能只是忽略错误:在 import 行之前添加一行 // @ts-ignore。此功能自 TypeScript 2.6 (released on Oct 31, 2017) 起可用,只能作为最后的手段使用。
  • 这对我来说失败了,因为“文件 C:/blah/blah/blah/name_of_the_module.d.ts 不是一个模块。”详情请见my similar question。
  • @deKajoo,所以对于像下面这样的 axios.js 文件,我将文件名更改为 axios.d.ts?我需要更改引用(从“./axios.js 导入 axios” ") 也在 main.js 中?从'axios'导入axios;导出默认 axios.create({""});
  • 不知道axios lib是怎么定义的。可能是:import axios from 'axios'; 或 import * as axios from 'axios'; 请记住,您只是在此处导入定义文件,因此在创建 .d.ts 时应遵守 lib 的工作方式。另外 axios 似乎在库中没有 .d.ts 所以你不应该需要这个:github.com/axios/axios/blob/master/index.d.ts 你可能只需要npm install axios 就是这样
  • @deKajoo,./axios.js 文件的定义类似于import axios from 'axios'; export default axios.create({""});。在这种情况下,我是否需要将axios.js 文件名更改为axios.d.ts?是否还需要在 main.js 中更改引用(从“./axios.js”导入 axios)?如您所见,这些是新手 Typescript 问题。
【解决方案2】:

您可以在项目的根目录中创建一个名为:global.d.ts 的文件并添加:

declare module '*';

【讨论】:

    猜你喜欢
    • 2023-02-18
    • 2021-07-24
    • 2020-04-04
    • 1970-01-01
    • 2021-02-03
    • 2017-10-22
    • 2016-03-21
    • 2021-03-29
    • 1970-01-01
    相关资源
    最近更新 更多