我使用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属性中。
重现问题:
执行'npm install',使用VSCode打开并转到文件'src / test.ts'。
答案 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模块
然后在你想要发布的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文件夹,第二个项目的最终结构将如下所示,
最后在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();
希望这有帮助。