使用自定义常量枚举的Typescript定义



我正在尝试为库创建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为您生成声明。

相关内容

  • 没有找到相关文章

最新更新