我的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",可能是因为导入阻止了它成为环境.

在使用第三方类型的同时,是否有一些简单的方法来保持声明的环境友好度?

推荐答案

是的,有办法.在TypeScript 2.9中使用import() a type变得更容易,但在早期版本的TypeScript中也可以使用import() a type.

下面的文件是script.脚本中声明的内容将添加到脚本中.这就是为什么不用导入就可以使用MyApp.MyThing.

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

脚本的局限性在于它们不能导入任何内容;当添加import时,脚本将变为module.我觉得至少可以说这很奇怪,但事实就是这样.重要的是,module中定义的内容被限定在该模块的范围内,而不是添加到全局范围内.

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

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

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

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

请注意,使用.d.ts扩展与无需导入即可访问接口无关.上述两个文件可能都是.ts个文件,但它们的行为仍然完全相同.

Typescript相关问答推荐

为什么ESLint抱怨通用对象类型?

如果一个变量不是never类型,我如何创建编译器错误?

无法将select选项的值设置为ngFor循环中的第一个元素

打印脚本丢失函数的泛型上下文

有没有办法解决相互影响的路由之间的合并?

在MessageStore对象中实现条件类型时出现TypeScrip错误

获取函数中具有动态泛型的函数的参数

在实现自定义主题后,Angular 不会更新视图

如何使用Geojson模块和@Types/Geojson类型解析TypeScrip中的GeoJSON?

如何将TS泛型用于react-hook-form接口?

从route.参数获取值.订阅提供";无法读取未定义";的属性

类型推断对React.ForwardRef()的引用参数无效

错误:NG02200:找不到类型为';对象';的其他支持对象';[对象对象]';.例如数组

在抽象类属性定义中扩展泛型类型

打字脚本错误:`不扩展[Type]`,而不是直接使用`[Type]`

作为参数的KeyOf变量的类型

基于区分的联合键的回调参数缩小

确保财产存在

显式推断元组类型

输入 'Resolver<{ email: string;密码:字符串; }>' 不可分配给类型 'Resolver'