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

kea*_*ade 4 momentjs typescript typescript2.0

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

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

import { Moment } from 'moment';

interface Test {
  date: Moment;
}
Run Code Online (Sandbox Code Playgroud)

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

[at-loader] ./src/<examplefilename>.tsx:91:26 
    TS2304: Cannot find name 'Test'. 
Run Code Online (Sandbox Code Playgroud)

VSCode的TypeScript错误检查和TSLint均未显示该代码的任何问题。

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

小智 35

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

interface Test {
  date: import('moment').Moment;
}
Run Code Online (Sandbox Code Playgroud)

或者

type Moment = import('moment').Moment;
interface Test {
  date: Moment;
}
Run Code Online (Sandbox Code Playgroud)

无需导出任何接口;)


Way*_*oss 18

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

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

declare interface Xyz extends RouteProps {
  yada: string;
}
Run Code Online (Sandbox Code Playgroud)


Kon*_*sky 6

当文件具有顶层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
};
Run Code Online (Sandbox Code Playgroud)

  • 这样就解决了问题,谢谢!现在仅由于我导入了一件东​​西而不得不手动导出我的所有接口有点令人沮丧。 (2认同)