如何在d.ts文件中导入类型(从另一个文件)而不将其转换为模块?

时间:2020-09-09 16:06:35

标签: typescript import namespaces typescript-typings

d.ts文件和名称空间而言,出现了一种奇怪的情况。

我有一些d.ts文件,我在其中声明并合并了名为namespace的{​​{1}}。

请参见下文如何声明和自动合并(跨多个文件):

file1.d.ts ----- file2.d.ts ----- file3.d.ts < / p>

PROJECT

可以从项目的每个文件中自动访问declare namespace PROJECT { interface SOME_INTERFACE { ... } type SOME_TYPE = SOME_UNION_TYPE // ETC } 名称空间。示例:

SomeComponent.tsx

PROJECT

这是所有预期的行为。

当我决定声明另一个名称空间时,我的问题就开始了。

ADMIN_BLOGPOST.d.ts

const someVariable: PROJECT.SOME_INTERFACE = { 
  // ... 
};

仅由于import type { ACTION_THUNK_GENERIC } from "@hooks/useReducerThunk"; declare namespace ADMIN_BLOGPOST { // HERE I DECLARE MULTIPLE TYPES // AND ONE OF THE TYPES USES THE `ACTION_THUNK_GENERIC` TYPE, WHICH IS BEING IMPORTED HERE type ACTION_THUNK = ACTION_THUNK_GENERIC<ACTION,GET_STATE> } 的顶级import type,现在我的名称空间不再自动可用。

VSCode开始考虑将ACTION_THUNK_GENERIC作为一个模块,并开始让我不得不ADMIN_BLOGPOST.d.ts使用该命名空间,例如:

SomeComponent.tsx

import

请注意,如果我从import type { ADMIN_BLOGPOST } from "@src/types/ADMIN_BLOGPOST"; const someVariable: ADMIN_BLOGPOST.ACTION_THUNK 文件中删除了该顶级导入(导入ACTION_THUNK_GENERIC的导入),那么我的ADMIN_BLOGPOST.d.ts命名空间将变为可用,而无需{{1 }}首先。

但是我真的需要导入。因为我需要ADMIN_BLOGPOST类型,所以我可以构建非泛型import类型。

是否有其他方法可以使我的ACTION_THUNK_GENERIC名称空间可用,而不必在使用前将其导入?即:如何在ACTION_THUNK文件中ADMIN_BLOGPOST而不将其转换为模块?

1 个答案:

答案 0 :(得分:4)

使用declare global在全局命名空间中工作,而与模块导入无关。例如:

import type { ACTION_THUNK_GENERIC } from "@hooks/useReducerThunk";
declare global {
  declare namespace ADMIN_BLOGPOST {
    type ACTION_THUNK = ACTION_THUNK_GENERIC<ACTION,GET_STATE>
  }
}

或者,您可以使用动态导入:

declare namespace ADMIN_BLOGPOST {
  type ACTION_THUNK = import("@hooks/useReducerThunk").ACTION_THUNK_GENERIC<ACTION,GET_STATE>
}