网站搜索

typescript - 发布为 npm 模块后声明合并不起作用


在 core.ts 中定义了一个类 AnyId。

在 time.ts 中,它添加了一些更多的方法。我使用声明合并扩展了 AnyId 的类型:

declare module './core' {
  interface AnyId {
    time(unit?: TimeUnit): AnyId;
    since(t: Date): AnyId;
  }
}

在测试用例中运行良好。额外方法 time 和 since 的类型可用。

但是在模块作为 npm 模块发布并被导入后,声明合并不起作用:

import {anyid} from 'anyid';
anyid().encode('Aa0').time().since(new Date('2018-11-1'));
//                    ^^^^ error TS2339: Property 'time' does not exist on type 'AnyId'.

答案#1

在 time.ts 中完成的声明合并在从已发布的 anyid 模块导入时不可见,因为已发布的 index.d.ts 根本没有引用 time 模块。

发布的 index.d.ts 仅包含

import { AnyId } from './core';
declare function anyid(): AnyId;
export default anyid;
export {  AnyId, anyid };

在源文件 index.ts 中从 ./time 导入 Time 的那一行被编译器省略了,因为 Time 并未在 index.d.ts 中生成的任何声明中作为类型使用。

解决此问题的最简单方法是在 index.ts 中显式引用 time,正如这里推荐的,或者只是重新导出 Time:

import { AnyId } from './core';
import { Time } from './time';
import { Random } from './random';
import { Fixed } from './fixed';
import { Sequence } from './seq';
import { Func } from './function';
import { Variable } from './variable';

export { Time } from './time';