由typescript生成的定义文件(.d.ts)不能与package.json typings

时间:2016-05-07 17:02:21

标签: node.js typescript

我使用tsc编译器中的--declaration参数从我的typescript项目创建了一个定义文件(d.ts)。

但是当我尝试在npm package.json 中发布包含 typings 属性的包时,这个生成的定义文件显然不起作用。我已经创建了另一个项目来测试它。

它抱怨消息:“导出的外部包文件打包文件'... d.ts'不是模块。请联系包作者以更新包定义”。

这是我的源文件:

MyInterface.ts

export interface MyInterface
{
    MyProperty: string;
}

MyClass.ts

import {MyInterface} from './MyInterface';

export class MyClass implements MyInterface
{
    get MyProperty(): string
    {
        return "MyString";
    }
}

MyInheritedClass.ts

import {MyClass} from './MyClass';

export class MyInheritedClass extends MyClass
{
    public MyMethod(): number
    {
        return 1;
    }
}

tsc命令是这样的:

tsc MyClass.ts MyInterface.ts MyInheritedClass.ts --declaration -t es5 -outFile "mydefinition.js" --module "system"

这是生成的定义:

mydefinition.d.ts

declare module "MyInterface" {
    export interface MyInterface {
        MyProperty: string;
    }
}
declare module "MyClass" {
    import { MyInterface } from "MyInterface";
    export class MyClass implements MyInterface {
        MyProperty: string;
    }
}
declare module "MyInheritedClass" {
    import { MyClass } from "MyClass";
    export class MyInheritedClass extends MyClass {
        MyMethod(): number;
    }
}

我还有其他事情要做,或者生成的定义据说在package.json打字中不起作用吗?

更新了解详情:

情景是我有2个项目:

  • 第一个项目是我生成库的地方,我将发布到npm,而package.json是我将typings属性链接到tsc -d命令生成的mydefinition.d.ts文件的地方。

  • 我创建的第二个项目是通过添加生成的包(带有打字)来测试第一个项目。

包含2个项目的链接以及该方案的其他链接:

https://github.com/jvitor83/typings-packagejson

我认为问题在于第一个链接上的“您的定义文件应该写为外部模块”。 但我想知道是否有办法将这些定义生成放在package.json的typings属性中。

重现问题:

2 个答案:

答案 0 :(得分:3)

  

解决方案是:

1 - 添加一个文件' index.ts'导出所有其他文件。

['ab', 'abc', 'aá']
['aá', 'ab', 'abc']

2 - 在构建过程中添加两个文件的编译/转换(一个用于声明,另一个用于单个js文件[在tsc编译器中具有out属性])

export * from "./MyInterface"
export * from "./MyClass"
export * from "./MyInheritedClass"

构建过程中的更多信息:https://github.com/jvitor83/typings-packagejson/blob/master/gulpfile.js

和索引文件:https://github.com/jvitor83/typings-packagejson/blob/master/app/src/typings-packagejson.ts

答案 1 :(得分:1)

你什么时候收到这个错误?

我在另一个项目中使用了生成的d.ts文件并且工作正常。

   /// <reference path="mydefinition.d.ts" />

  import { MyInterface } from "MyInterface";
  import { MyClass } from "MyClass";
  import { MyInheritedClass } from "MyInheritedClass";

  let x: MyInterface = { MyProperty: "hello!!" };
  let y: MyClass = new MyClass();
  let z: MyInheritedClass = new MyInheritedClass();

编译时会生成JS文件,

 /// <reference path="mydefinition.d.ts" />
 "use strict";
 var MyClass_1 = require("MyClass");
 var MyInheritedClass_1 = require("MyInheritedClass");
 var x = { MyProperty: "hello!!" };
 var y = new MyClass_1.MyClass();
 var z = new MyInheritedClass_1.MyInheritedClass();

在某些HTML文件中使用此错误时是否收到此错误?您是否在HTML中包含了mydefinition.js文件?

<强>更新

根据您的详细信息,以下是我可能提出的解决方案, 添加另一个名为index.ts的文件,并从那里导出所有模块,

<强> index.ts

    export * from "./MyInterface"
    export * from "./MyClass"
    export * from "./MyInheritedClass"

添加tsconfig.json文件以便于构建

<强> tsconfig.json

    {
     "version": "1.0.0",
     "compilerOptions": {
        "target": "ES5",
        "module": "commonjs",
        "moduleResolution": "node",
        "sourceMap": false,
        "declaration": true,
        "outDir": "lib/"
    }       
   }

注意我已将它设为commonjs模块(不确定它是否适合您的需要),使用tsc命令生成构建。它将生成如下文件,注意它已为所有ts文件添加了js文件,d.ts也适用于所有模块,但由于我们已从单个文件导出所有模块,因此将更容易在package.json文件中用于npm模块

enter image description here

然后在你想要发布的npm模块中添加package.json,如下所示,让我们考虑模块名称 foo

<强>的package.json

    {
     "name": "foo",
     "author": "author name",
     "version": "1.0.0",
     "main": "lib/index.js",
     "typings": "lib/index.d.ts"
    }

现在在node_module中添加foo文件夹,第二个项目的最终结构将如下所示,

enter image description here

最后在test.ts文件导入和使用中,

<强> test.ts

    import { MyInterface, MyClass, MyInheritedClass } from "foo";

    let x: MyInterface = { MyProperty: "hello!!" };
    let y: MyClass = new MyClass();
    let z: MyInheritedClass = new MyInheritedClass();

希望这有帮助。