如何在项目中全局声明类型(打字稿)

Man*_*anu 23 typescript

在一个打字稿项目中,有没有办法声明一个类型并在所有文件中共享它,就像我们可以访问全局定义的类型一样node.d.ts

例如,让我们说在我的项目中,a IUser就是这样的东西

interface IUser {
   name: string,
   mail: string
 }
Run Code Online (Sandbox Code Playgroud)

好的,我可以在一个common/interfaces.ts文件中创建该接口并在每次需要时导入它...但是能够为整个项目全局声明这样的接口并且可以快速访问它们而不导入任何文件会很好

Joh*_*isz 26

您可以创建一个定义文件,以.d.ts扩展名结尾,并将其放在您喜欢的项目中:

user.d.ts

interface IUser {
    name: string,
    mail: string
}
Run Code Online (Sandbox Code Playgroud)

这也是填充缺失的全局类型的好方法.lib/global每个项目都有一个文件夹来放置这些文件.

注意:这仅适用于类型定义,而不适用于实际代码,因为(1)实际代码必须以某种方式导入,(2).d.ts环境代码.此外,对于以这种方式定义为全局可见的类型,相应的声明文件不应包含顶级导出(否则声明文件将被视为模块,需要导入才能访问其类型).

  • 如果你需要从依赖项中导入一个类型怎么办?例如`时刻' (3认同)
  • @Manu-同样,它仅在`.d.ts`文件未被识别为_module_时才有效-也就是说,不要在`user.d.ts`中使用顶级导出。 (2认同)
  • “声明文件不应包含顶级导出”是我的问题。很难找到这些问题的答案......非常感谢! (2认同)

Sef*_*efe 5

您可以在多个文件中定义类型,并在其他文件中使用它们。有两种可能的方法:

  1. 这些文件使用相同的名称空间。在这种情况下,可以直接重用该类型。
  2. 这些文件使用不同的名称空间。在这种情况下,可重用类型必须标记为export。然后可以在其他名称空间中使用它。使用该import语句,您可以避免必须使用名称空间前缀。

无论如何,您都必须添加要重用其类型的文件引用

相同的名称空间

文件1:

namespace Example {
    export interface IUser {
       name: string,
       mail: string
    }
}
Run Code Online (Sandbox Code Playgroud)

档案2:

/// <reference path="./File1.ts" />

namespace Example {
    class User implements IUser {
       name: string,
       mail: string
    }
}
Run Code Online (Sandbox Code Playgroud)

不同的名称空间

文件1:

namespace Example {
    export interface IUser {
       name: string,
       mail: string
    }
}
Run Code Online (Sandbox Code Playgroud)

文件2(不导入):

/// <reference path="./File1.ts" />

class User implements Example.IUser {
   name: string,
   mail: string
}
Run Code Online (Sandbox Code Playgroud)

文件2(含导入):

/// <reference path="./File1.ts" />

import IUser = Example.IUser;

class User implements IUser {
   name: string,
   mail: string
}
Run Code Online (Sandbox Code Playgroud)

  • 问题:为什么不提及`.d.ts`方法?仅仅因为它在另一个答案中? (2认同)

Die*_*itz 5

在项目根目录中创建 global.d.ts。

这是如何声明全局类型常量和接口的示例,这些常量和接口将被全局理解

//example import for externally loaded library
//this will not form part of the bundle but will allow typescript to understand external libraries throughout the project
import _ from 'lodash'; 

declare global { 
    //Example global constant for libraries served via webpack externals. example webpack config:: externals: { _: 'lodash' }
    //This assumes lodash was already load in DOM for example in <head> via CDN link before main.js is loaded.
    const _: typeof _; 

    //example of custom types
    type JSONPrimitive = string | number | boolean | null;
    type JSONValue = JSONPrimitive | JSONObject | JSONArray;
    type JSONObject = { [member: string]: JSONValue };

    //example of custom interface
    interface JSONArray extends Array<JSONValue> {}
}
Run Code Online (Sandbox Code Playgroud)

  • 在基于模块的项目中,您不需要 ```global {}``` 只需将 ```declare type XXXX``` 放在 ```_whatever.d.ts``` 中,并确保它位于你的项目源文件夹 (2认同)