Импорт типов наряду с основным импортом с import / require - PullRequest
0 голосов
/ 06 мая 2018

Я пишу файл определения для airtable, и, к сожалению, они экспортируют только один класс, подобный этому:

...

module.exports = Airtable;

Итак, мой airtable.d.ts файл выглядит так:

declare module "airtable" {
    export type MyType = { ... };

    export class Airtable {
        ...
    }

    export = Airtable;
}

Когда я импортирую класс Airtable, он прекрасно работает:

import Airtable = require("airtable");
...
new Airtable(...)

Но я также не могу найти способ импортировать MyType:

let a: Airtable.MyType;

Результат к этой ошибке:

«Airtable» относится только к типу, но используется в качестве пространства имен здесь

И

import { MyType } from "airtable";

Результаты в этих ошибках:

Модуль «airtable» не имеет экспортируемого члена «MyType»
Модуль "airtable" преобразуется в немодульную сущность и не может быть импортирован с использованием этой конструкции

Есть идеи, как импортировать другие экспортируемые типы, продолжая использовать export = и import/require?
Спасибо.

1 Ответ

0 голосов
/ 24 мая 2018

Так что ответ на самом деле зависит от того, как вы собираетесь использовать типы. Если вы используете их в своем собственном проекте, вам нужен файл (с именем <whatever>.d.ts), который объявляет модуль с именем "airtable". В этом вам нужно что-то экспортировать. Поскольку вы экспортируете класс, вы должны использовать синтаксис export = X вместо export X, потому что вы изменяете весь объект экспорта, а не добавляете свойство. на объект экспорта (подробнее об этом в секунду). Что касается типов, то вне модуля в вашем файле .d.ts вы также можете decalre тип, который станет общедоступным. Если это вас не устраивает (или вы беспокоитесь о конфликтах), вы также можете поместить свой тип в модуль. Так как это только для машинописного текста, его не нужно подкреплять никаким js-кодом. Затем вы можете импортировать / экспортировать его как обычно:

// my.d.ts

declare module 'airtable' {
  class Airtable {
    constructor(opts?: MyType)
  }
  export = Airtable
}

declare type MyType = string | number

declare module 'AirtableTypes' {
  export type MyString = string
  export type MyNumber = number
}

и использование

// index.ts
import Airtable from 'airtable'
import AirtableTypes from 'AirtableTypes'

const a = new Airtable('a')

const n: MyType = 3

const s: AirtableTypes.MyString = '3'

Если вы хотите добавить типы к DefinitelyTyped (что, я уверен, они оценят!), Вы можете следовать руководству здесь , чтобы создать файл декларации.

Он укажет вам на

Вы (правильно) отметили, что Airtable экспортирует один класс, который не очень хорошо работает с TS. Здесь обсуждается . В любом случае, приведенное выше руководство укажет вам на module-class.d.ts, что позволит вам объявить экспортируемый класс и сопутствующие типы. Вы не могли использовать это выше, так как формат доступен только когда файлы определений находятся в корне модуля или @types/<module>.

/*~ This declaration specifies that the class constructor function
 *~ is the exported object from the file
 */
export = Airtable

/*~ Write your module's methods and properties in this class */
declare class Airtable {
  constructor(opts?: Airtable.AirtableMethodOptions)
}

/*~ If you want to expose types from your module as well, you can
 *~ place them in this block.
 */
declare namespace Airtable {
  export interface AirtableMethodOptions {
    endpointUrl: string
  }
}
...