Как объявить тип глобально в проекте (typescript)

В проекте typescriptесть ли способ объявить тип и поделиться им по всем файлам, так же, как мы имеем доступ к типам, определенным глобально в node.d.ts?

Например, скажем, что в моем проекте a IUser есть что-то вроде

interface IUser {
   name: string,
   mail: string
 }

Хорошо, я могу создать этот интерфейс в файле common/interfaces.ts и импортировать его каждый раз, когда мне это нужно... но было бы так приятно объявить такие интерфейсы глобально для всего проекта и иметь быстрый доступ к ним без импорта какого-либо файла

Ответ 1

Вы можете создать файл определения, заканчивающийся расширением .d.ts, и поместить его в свой проект там, где вам нужно:

user.d.ts

interface IUser {
    name: string,
    mail: string
}

Это также хороший способ заполнить пропущенные глобальные типы. У меня есть папка lib/global каждого проекта, чтобы разместить эти файлы.

Это работает только с определениями типов, а не с реальным кодом, поскольку (1) фактический код должен быть импортирован каким-либо образом, (2) .d.ts является ambient. Кроме того, для типов, определенных таким образом, чтобы быть видимыми глобально, соответствующий файл объявления не должен содержать экспорт верхнего уровня (в противном случае файл объявления будет рассматриваться как модуль, требующий импорта для доступа к его типам).


Вы также можете объявить модули:

declare module "my-module" {
    export declare class Something {
        public something: number;
    }
}

И тогда TypeScript позволит следующее:

import { Something } from "my-module";

Ответ 2

Вы можете определять типы в нескольких файлах и использовать их в других файлах. Есть два возможных способа:

  1. Файлы используют одно и то же пространство имен. В этом случае тип может быть повторно использован напрямую.
  2. Файлы используют разные пространства имен. В этом случае повторно используемый тип должен быть помечен как export. Затем его можно использовать в других пространствах имен. С помощью оператора import вы можете избежать необходимости использовать префикс пространства имен.

В любом случае вам нужно добавить ссылку на файл, типы которого вы хотите использовать повторно.

То же пространство имен

Файл 1:

namespace Example {
    export interface IUser {
       name: string,
       mail: string
    }
}

Файл 2:

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

namespace Example {
    class User implements IUser {
       name: string,
       mail: string
    }
}

Разные пространства имен

Файл 1:

namespace Example {
    export interface IUser {
       name: string,
       mail: string
    }
}

Файл 2 (без импорта):

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

class User implements Example.IUser {
   name: string,
   mail: string
}

Файл 2 (с импортом):

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

import IUser = Example.IUser;

class User implements IUser {
   name: string,
   mail: string
}