Як оголосити та імпортувати інтерфейси машинопису в окремий файл


84

Я хочу визначити кілька інтерфейсів у своєму власному файлі у своєму проекті на основі машинопису, з якого я буду реалізовувати класи для виробництва, а також макети для тестування. Однак я не можу зрозуміти, який правильний синтаксис. Я знайшов безліч підручників з оголошення інтерфейсів та їх реалізації, але всі вони мають тривіальну реалізацію як інтерфейсу, так і похідних класів в одному файлі, що не дуже реально. Який правильний спосіб експортувати та імпортувати інтерфейси?

Відповіді:


118

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

у IfcSampleInterface.ts:

export interface IfcSampleInterface {
   key: string;
   value: string;
}

В SampleInterface.ts

import { IfcSampleInterface } from './IfcSampleInterface';
let sampleVar: IfcSampleInterface;

5
Це синтаксис, який я спробував спочатку, але з ним я отримую помилки.
хропіти

1
@snort, будь ласка, детальніше поясніть, який тип помилки ви отримуєте?
Аджай

Схоже, проблема полягає в тому, що ім'я типу не можна використовувати як ключ в Aurelia (або я просто не знаю, як правильно це оголосити). Помилка: "Не вдається знайти ім'я [BTAuthService]". Цей код видає помилку: container.registerSingleton (BTAuthService, MockAuthService); Якщо я спочатку присвоюю інтерфейс var і передаю його registerSingleton, я не отримую помилки.
хропіть

Я припускаю, що я щось не розумію щодо конструкторів TS / JS та імен типів.
хропіння

Типи інтерфейсу усуваються з переписаного коду, отже, помилка. Позначивши це як правильну відповідь на моє неповне запитання. Справжня проблема полягала в тому, що я намагався використовувати ім'я інтерфейсу як ім'я типу в цьому конкретному випадку.
хропіти

65

Використовуйте d.tsфайли визначення ( ) та простори імен, не потрібно імпортувати / експортувати модулі таким чином. Напевнений тип проекту має керівництво та величезну кількість прикладів, як це зробити.


6
Це правильна відповідь IMO. Якщо ваш файл визначає лише інтерфейс, це найкращий спосіб і набагато чистіший.
орад,

9
Якщо у вас є module.tsта module.d.tsв тій самій папці, компілятор пропустить module.d.tsфайл, тому ваші декларації не будуть розглядатися. Перейменуйте d.tsфайл або перемістіть його в іншу папку. Цей підхід приємний, якщо у вас є належний модуль , але якщо ви хочете поділитися типами між модулями, краще використовуйте import .. from ...
jpenna

5
як це навіть прийнятна відповідь. Можливо, ви думаєте, що це схиляється в правильному напрямку (і, мабуть, так і є), але загальне посилання на перелік статей, за якими нам доводиться шукати, щоб знайти відповідь, на яку натякає Артем, еквівалентно сказанню "я не збираюся пояснювати комунізм, іди шукати в Інтернеті "
airtonix

Я додав d.tsсвій проект реагування, але мені все одно потрібно імпортувати інтерфейси.
Хамід Маєлі

Отже, ви пропонуєте використовувати файли декларацій і для типів внутрішнього обміну? Хіба це не зробить типи доступними у всьому світі протягом усього проекту? Крім того, я бачив використання файлів декларацій лише тоді, коли код JavaScript хоче виставляти типи для споживачів, а не для внутрішніх цілей.
gaurav5430

11

Експортуйте лише кілька інтерфейсів

Без розповсюдження декількох експортів ви можете згрупувати їх в один export {}блок (у цьому випадку неdefault слід оголошувати тип файлу ):

// interfaces.ts
interface IWords {
  [key: string]: string; 
}

interface INumbers {
  [key: string]: number; 
}

interface IBooleans {
  [key: string]: boolean; 
}

interface IValues {
  [key: string]: string | number; 
}

interface IStructures {
  [key: string]: INumbers | IBooleans | IValues;
}

export {
  // not exporting IWords | INumbers
  IBooleans,
  IValues,
  IStructures,
}

Приклад імпорту

import { IBooleans, IValues, IStructures } from 'interfaces';

const flags: IBooleans = { read: true, write: false, delete: false };

const userFile: IValues = { user: 1, username: 'One', file: 'types.txt' };

const userContext: IStructure = {
  file: userFile,
  permissions: flags,
  counts: { views: 3, writes: 1 } // => INumbers (lint: try to remove IValues from IStructures)
};

3

Вам потрібно експортувати інтерфейси у файлі, де визначено, та імпортувати їх у файли, в яких вони використовуються. Див. Це посилання для прикладів.

x.ts

interface X{
    ...
}
export default X

y.ts

import X from "./x.ts"
// You can use X now

Для отримання додаткової інформації див. Https://www.typescriptlang.org/docs/handbook/modules.html

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.