导入浏览器的第三方JS节点模块的当前方法是什么?

时间:2016-05-12 19:55:04

标签: typescript

关于这个主题有很多问题和答案,但我似乎找不到最新的答案。

我想使用node_modules中本地安装的模块hyperscript。它没有d.ts文件。

我可以创建一个,我相信应该是这样的:

declare module 'hyperscript' {
    export default function H(...a: any[]) : HTMLElement;
}

我把它放在src / typings / hyperscript.d.ts中,这些打字稿似乎已经找到了。

我的ts源文件有:

import H from 'hyperscript';

const element = H('h1', "This is a title");

我编译&捆绑:

browserify --debug src/main.ts -p [ tsify --noImplicitAny ] > js/bundle.js

这一切顺利,但是当我尝试在浏览器中运行时,我得到:

Uncaught TypeError: hyperscript_1.default is not a function

我很确定hyperscript只输出一个默认函数,因为在带有babel / browserify的普通JS中,我使用:

import H from 'hyperscript';

它运作正常。

我的package.json看起来像:

{
  "name": "hyperscript-example-ts",
  "version": "1.0.0",
  "description": "hyperscript typescript example",
  "author": "Me",
  "license": "MIT",
  "private": true,
  "dependencies": {
    "hyperscript": "latest"
  },
  "devDependencies": {
    "browserify": "latest",
    "tsify": "latest",
    "uglifyjs": "latest"
  },
  "scripts": {
    "build": "browserify --debug src/main.ts -p [ tsify --noImplicitAny ] > js/bundle.js"
  }
}

我的tsconfig.json:

{
    "compilerOptions": {
        "target": "es5",
        "module": "commonjs",
        "moduleResolution": "node",
        "allowJs": true,
        "declaration": false,
        "noImplicitAny": true,
        "removeComments": false,
        "noLib": false,
        "preserveConstEnums": true,
        "suppressImplicitAnyIndexErrors": true,
        "outDir": "js",
        "sourceMap": true,
        "watch": false
    },
    "filesGlob": [
        "src/**/*.ts",
        "src/typings/**/*.d.ts",
        "!./node_modules/**/*.ts"
    ],
    "atom": {
        "rewriteTsconfig": false
    }
}

任何帮助都非常感谢!

编辑:在此更多地删除它,看起来这样做的唯一方法是重新编写我的导入:

/// <reference path="./typings/hyperscript.d.ts" />
import _H = require('hyperscript'); // Gets no type info from my d.ts file
const H: (...a: any[]) => HTMLElement = _H as any;

TypeScript手册说我应该可以使用第三方JS node_modules的标准导入语法。引自this page

/// <reference path="node.d.ts"/>
import * as URL from "url";
let myUrl = URL.parse("http://www.typescriptlang.org");

1 个答案:

答案 0 :(得分:1)

声明文件基本上是试图将环境世界解释为TypeScript(more

的开发人员

在您的情况下声明:

declare module 'hyperscript' {
    export default function H(...a: any[]) : HTMLElement;
}

实际上是错的。函数H不是默认导出。它是的主要出口。所以你真正想要的是:

declare module 'hyperscript' {
    export = function H(...a: any[]) : HTMLElement;
}