我正在尝试为库创建TypeScript定义文件。
该库有一个方法,可以接受类型为number
的参数,但该参数只能是一组特定的数字,所以我想让我的定义说它需要我使用const enum
创建的枚举类型。
然而,当我在.d.ts
中定义我的类时,就像这样:
// definitions/SimpleDefinition.d.ts
/// <reference path="Enums.ts" />
declare class SampleDefinedClass {
public static SampleMethod(enumArg: Enums.SampleEnum): void;
}
我的枚举如下:
// definitions/Enums.ts
export const enum SampleEnum {
Item1 = 1,
Item2 = 2
}
我有一个index.d.ts
把2联系在一起:
// definitions/index.d.ts
/// <reference path="Enums.ts" />
/// <reference path="SampleDefinition.d.ts" />
编译器告诉我:
../definitions/SampleDefinition.d.ts(4,41): error TS2503: Cannot find namespace 'Enums'.
我尝试在SampleDefinition.d.ts
的顶部添加一个导入,但这导致在代码文件中无法正确识别该定义。尽管Visual Studio和Visual Studio代码在实际导入时不会显示错误。
import Enums = require("./Enums");
Main.ts(6,1): error TS2304: Cannot find name 'SampleDefinedClass'.
我还尝试了一些方法,比如使用AMD和四处移动文件,但似乎无法实现。有办法做到这一点吗?还是我必须找到另一种方法去做/放弃?
我已经用这个确切的样本创建了一个GitHub回购。
您的SampleDefinition.d.ts
没有顶级导入或导出,而Enum.ts
有。也就是说,Enums
是一个模块,而SampleDefinition
不是,但你试图在其中使用Enums
。使用旧的(过时的)术语,SampleDefinition.d.ts
是内部模块,Enums
是外部模块,不能将两者混合在一个应用程序中。
有两种方法可以使它们保持一致:
一种方法是使所有内容都在内部,而不需要任何顶级导入/导出:
固定Enum.ts
:将export
包裹在namespace
中
namespace Enums {
export const enum SampleEnum {
Item1 = 1,
Item2 = 2
}
}
已修复Main.ts
-仅删除import Enums ..
行
/// <reference path="../definitions/index.d.ts" />
console.log(Enums.SampleEnum.Item2);
SampleDefinedClass.SampleMethod(Enums.SampleEnum.Item1);
另一种方法是将所有东西都变成一个模块:
修复了SampleDefinition.ts
:使用import
而不是reference
,使用export
类而不是声明它:
import Enums = require("./Enums");
export class SampleDefinedClass {
public static SampleMethod(enumArg: Enums.SampleEnum): void;
}
固定了Main.ts
:再次,import
所有内容都显式地而不是reference
。这样,您根本不需要definitions/index.d.ts
:
import Enums = require("../definitions/Enums");
import {SampleDefinedClass} from "../definitions/SampleDefinition"
console.log(Enums.SampleEnum.Item2);
SampleDefinedClass.SampleMethod(Enums.SampleEnum.Item1);
选择哪种方式取决于你。主要区别在于,对于模块,您的应用程序在运行时需要模块加载程序。在没有模块的情况下,它可以编译成一个组合的脚本文件。这对浏览器来说最重要(在浏览器中您必须自己提供模块加载器),为节点编译的模块化代码将使用require
,并且工作正常。
在定义文件中,必须使用declare
导出枚举。
我查阅了一些来自"确定类型"的例子,这里有一个:
export declare enum EDeflateStrategy {
DEFAULT_STRATEGY = 0,
FILTERED = 1,
HUFFMAN_ONLY = 2,
RLE = 3,
FIXED = 4,
}
代码的问题在于,您的定义文件看起来是一个.ts文件,而不是另一个.d.ts文件。
如果这是你的图书馆,它是用ts写的,你可以添加
"declaration": true
在tsconfig.json文件中,让tsc为您生成定义。
如果不是,您可以尝试在ts中模拟该库中的内容,并通过启用此选项让tsc为您生成声明。