当前位置: 首页 > 知识库问答 >
问题:

TypeScript中导入类型的环境声明

祖利
2023-03-14

我的TypeScript项目中有一个声明文件,如下所示:

// myapp.d.ts
declare namespace MyApp {
  interface MyThing {
    prop1: string
    prop2: number
  }
}

这很好用,我可以在项目中的任何地方使用这个名称空间,而无需导入它。

我现在需要从第三方模块导入一个类型并在我的环境声明中使用它:

// myapp.d.ts
import {SomeType} from 'module'

declare namespace MyApp {
  interface MyThing {
    prop1: string
    prop2: number
    prop3: SomeType
  }
}

编译器现在抱怨它找不到名称空间“MyApp”,可能是因为导入阻止了它处于环境中。

是否有一些简单的方法可以在使用第三方类型的同时保留声明的环境性?

共有3个答案

酆鸿彩
2023-03-14

不知道您是否仍在寻找答案,但这是正确的处理方法,并且仍然能够定义通用模块,而不仅仅是命名名称空间:(这是基于原始答案)

// myapp.d.ts

declare namespace MyApp {
  import {SomeType} from 'module'
  interface MyThing {
    prop1: string
    prop2: number
    prop3: SomeType
  }
}
金坚
2023-03-14

由于TS 2.9,这可以通过import()实现:

// myapp.d.ts
declare type SomeType = import('module').SomeType;
declare type SomeDefaultType = import('module-with-default-export').default;


declare namespace MyApp {
  interface MyThing {
    prop1: string;
    prop2: number;
    prop3: SomeType | SomeDefaultType;
  }
}
邹斌
2023-03-14

是的,有一种方法。在TypeScript 2.9中,通过使用导入()类型变得更容易,但在早期版本的TypeScript中也可以使用。

以下文件是一个脚本。脚本中声明的内容将添加到全局范围。这就是为什么你可以使用MyApp。虚构而不导入它。

// myapp.d.ts
declare namespace MyApp {
  interface MyThing {
    prop1: string;
    prop2: number;
  }
}

脚本的局限性在于它们无法导入任何内容;添加导入时,脚本将成为一个模块。我认为至少可以说这很奇怪,但事实就是这样。重要的是,在模块中定义的内容被限定在该模块的范围内,而不是添加到全局范围。

但是,模块也可以将声明添加到全局范围,方法是将它们放在global中:

// myapp.d.ts
import {SomeType} from 'module';

declare global {
  namespace MyApp {
    interface MyThing {
      prop1: string;
      prop2: number;
      prop3: SomeType;
    }
  }
}

该文件是一个模块,但它在全局范围内添加了MyApp. MyThing的声明,因此您仍然可以在其他TypeScript代码中使用MyApp. MyThing而无需导入它。

请注意,使用.d.ts扩展名与您无需导入即可访问接口无关。上述两个文件都可能是. ts文件,并且仍然表现完全相同。

 类似资料:
  • 我正在创建一个环境模块来补充缺失的打字。我可以创建打字。d、 ts这为环境模块提供了正确的类型。 由于某种原因,当我这样做时,环境模块的import语句中断。 typings.d.ts 在上面的例子中,我想从另一个库中提供适当的返回类型。

  • 我试图实现的是从声明类型数组。 使用enum,我可以这样做: 输出将是 我想通过这种方式实现类似的目标: 输出类似: 有什么想法吗?我尝试了和。不幸的是,它不起作用。

  • 我撰写并发表了以下内容:https://github.com/justin-calleja/pkg-dependents 现在我写这个包在TypeScript:https://github.com/justin-calleja/update-dependents 我想在update dependents中重复使用pkg dependents(IndexInfoDict)中定义的类型,我想检查是否有

  • 在我的项目中,我希望有一个包含所有类型脚本定义的文件,如下所示: type_defs.tsx: 问题是,当我尝试导出typedefs时,如下所示: 我得到了错误: 正如我在网络中发现的那样,只能对typedef文件进行默认导出,这意味着我必须为每个类型定义准备一个文件,这绝对是荒谬的! 在我看来,不允许typedefs具有多个非默认导出的约束完全是无稽之谈,并且使编码变得多余且难以重用。拥有一个包

  • 我在这里查过了https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md这是TypeScript语言规范,但我找不到如何声明函数的返回类型。 我在下面的代码中展示了我所期望的: 我知道我可以用

  • 问题内容: 我想要一个npm脚本来创建/配置/等。最后导入一个SQL转储。整个创建,配置等都可以正常工作,但是,我无法使导入正常工作。永远不会插入数据。这就是我所拥有的(不要嵌套嵌套的回调,因为它们会变成promise): 我还尝试了Sequelize(ORM)进行以下操作: 问题答案: 这是我使用迁移框架设置初始Sequelized导入的方法。这里有很多事情要做,但总之我: 在migration