Headroom.js 使用 Typescript 找不到模块

Headroom.js with Typescript can't find the module

有人在 Typescript 领域使用过这个吗?谷歌搜索,似乎不是。

尝试将这个库合并到我的 Browserify 项目中,但没有任何运气。

我有 headroom.js

的 v0.9.3 的这个打字文件

当我尝试将模块导入我的应用程序时,找不到它。

{ [TypeScript error: resources/assets/typescript/app.ts(12,24): Error TS2307: Cannot find module 'headroom.js'.]
  message: 'resources/assets/typescript/app.ts(12,24): Error TS2307: Cannot find module \'headroom.js\'.',
  fileName: 'resources/assets/typescript/app.ts',
  line: 12,
  column: 24,
  name: 'TypeScript error' }

已尝试所有这些排列:

import {Headroom} from "headroom.js";    //nope
import {Headroom} from "headroom\.js";   //nope
import {Headroom} from "Headroom\.js";   //nope
import {Headroom} from "headroomjs";     //nope
import {Headroom} from "headroomjs";     //nope
import {Headroom} from "headroom";       //nope
import {Headroom} from "Headroom";       //nope
import * as headroom from "headroom.js"; // nope

确实正确导入了类型文件。

IDE是说可以找到目录:

我做错了什么?

编辑 2015 年 8 月 13 日

1。 app.ts 从 typings 目录中提取类型,如下所示:

/// <reference path="../../../typings/index.d.ts" />
  1. index.d.ts 包含这些类型 /// <reference path="bootstrap/bootstrap.d.ts" /> /// <reference path="custom.d.ts" /> /// ..etc... /// <reference path="Headroom/headroom.d.ts" />

肯定有。

Headroom 不包括任何打字。这就是 TypeScript 找不到 "the directory" 的原因。你可以做两件事:

(1) 添加您自己的 .d.ts 净空文件,并确保它在运行时可用。

(2) 使用const Headroom = require('headroom.js');导入。根据您的 browserify 配置,它应该在您构建项目时包含净空。请注意,您不会有任何余量输入。

我们将 (2) 与 webpack 一起使用,它工作正常。当你写 require('foo') 时,webpack 会尝试找到一个名为 "foo" 的 npm 包并将其添加到你的项目中。 TypeScript 可以,使用 require 因为它是在包含的 .d.ts 文件之一中定义的(例如 node.js )。但是,当然,您会错过 TypeScript 的自动完成功能等。

搜索 Headroom.js 的类型:

typings search headroom

找到一组需要用这个命令安装的声明:

typings install dt~headroom --global

安装坚持使用 --global 选项,这是正在发生的事情的第一个提示。安装的类型是 global;它们不是模块的类型(.d.ts 中没有定义模块)。因此 TypeScript 不会将它们与导入或必需的模块相关联。

要使用已安装的类型,您必须使用 require 导入模块,然后需要设置一个与类型中声明的 class 相匹配的全局(您提到过您我正在使用 Browserify,因此您应该可以使用 globalwindow 也可以):

global["Headroom"] = require("headroom.js");
let h = new Headroom(...); // TypeScript should use the typings here

查看 dist/headroom.js,很明显它可以通过 AMD、CommonJS 或普通 JavaScript 使用。为了反映这一点,我想 Headroom.js 的类型声明的作者已将它们设为全局。

我做了一些类似于@Sebastian 的回答来让它工作。在 src/ 文件夹中,创建了一个名为 headroom.js.d.ts 的新文件,其中仅包含:

declare module 'headroom.js';

然后就解决了。在我的功能组件中,我能够做到这一点:

import Headroom from "headroom.js";

export const Navigation: React.FC = () => {
    React.useEffect(() => {
        let headroom = new Headroom(document.getElementById("navbar-main"));
        headroom.init();
    }, [classes]);

    return (...);
}