如何将外部类型导入全局 .d.ts 文件

How to import external type into global .d.ts file

我正在使用 Moment.js 来处理我的 TypeScript 项目中的日期时间对象。我想定义一个对象类型,该类型的键的值类型为 Moment.

但是,当我将以下内容添加到全局定义文件 (test.d.ts) 时,该文件中的 none 个接口可以在项目的任何位置找到。

import { Moment } from 'moment';

interface Test {
  date: Moment;
}

当我尝试在 .ts.tsx 文件中使用该接口时,出现此 TypeScript 错误:

[at-loader] ./src/<examplefilename>.tsx:91:26 
    TS2304: Cannot find name 'Test'. 

VSCode 的 TypeScript 错误检查和 TSLint 都没有显示代码有任何问题。

如何从外部模块导入类型以用于全局定义文件?

当文件具有顶级 importexport 语句时,它被视为一个模块。您感兴趣的所有内容(类型、接口等)都需要在该文件中明确导出,并在需要这些类型的文件中导入。

// types.d.ts
import { Thingy } from 'sick-lib';

export declare interface IInterface {
  foo: any;
  bar: any;
  baz: Thingy;
}

// main.ts
import { IInterface } from 'types';

const xyz: IInterface = {
  foo: true,
  bar: false
};

使用 TypeScript 3.3+(也许从 2.4 开始,因为它是添加了对动态导入支持的版本),您有更好的方法来解决这个问题,使用以下任一方法:

interface Test {
  date: import('moment').Moment;
}

type Moment = import('moment').Moment;
interface Test {
  date: Moment;
}

无需导出任何接口 ;)

下面是 Create React App 项目中 global.d.ts 文件的示例:

declare type RouteProps = import("react-router-dom").RouteProps;

declare interface Xyz extends RouteProps {
  yada: string;
}