Как повторно использовать тип объединения TypeScript из стороннего модуля @types? - PullRequest
0 голосов
/ 10 апреля 2020

Итак, я новичок в TypeScript и хотел знать, есть ли способ повторно использовать тип объединения из стороннего модуля @types.

Пример, в @types/node у нас есть следующий тип объединения для кодировки буфера:

// Buffer class
type BufferEncoding = "ascii" | "utf8" | "utf-8" | "utf16le" | "ucs2" | "ucs-2" | "base64" | "latin1" | "binary" | "hex";

И если у меня есть служебная функция, которая передает значение до Buffer.from(), я должен указать тип объединения, совместимый с типом "BufferEncoding", я не могу просто используйте «строку» следующим образом:

export function convertToBuffer(input: string | Buffer, encoding?: string): Buffer {
    if (input instanceof Buffer) return input;
    return Buffer.from(input, encoding);
}

Очевидно, я мог бы просто скопировать и вставить тип BufferEncoding из @types/node, но это не сохранило мой код DRY, и мне не разрешено импортировать из @types/* modules.

export type BufferEncoding = "ascii" | "utf8" | "utf-8" | "utf16le" | "ucs2" | "ucs-2" | "base64" | "latin1" | "binary" | "hex";

export function convertToBuffer(input: string | Buffer, encoding?: BufferEncoding): Buffer {
    if (input instanceof Buffer) return input;
    return Buffer.from(input, encoding);
}

Меня не интересует использование типа "any" или других методов, которые ослабляют строгость проверок типов. Я подозреваю, что то, что я спрашиваю, может быть невозможным, и это нормально.

1 Ответ

0 голосов
/ 24 апреля 2020

Так что большое спасибо Алексею за то, что он указал мне правильное направление. Оказывается, у меня здесь было несколько разных проблем, которые накапливались.

  1. Типы для базовых пакетов Node - это действительно так же просто, как запустить npm install --save @types/node, а затем типы такие как BufferEncoding доступны для использования без импорта чего-либо.
export function doSomething(encoding?: BufferEncoding): void { ... }
Разрушение вложенных объектов - компилятор TypeScript не может определить типы переменных, если вы переназначаете их, используя деструктурирование или иным образом.

Это распространенный шаблон для деструктурирования объектов для извлечения переменных нам нужно:

import errors from './errors';
const { http: { BadRequestError } } = errors;

export function doSomething(err: BadRequestError): void { ... }

Однако это создает проблемы для компилятора TypeScript и выдает такие ошибки, как:

  • 'BadRequestError' refers to a value, but is being used as a type here. ts(2749)
  • Parameter 'err' of exported function has or is using private name 'BadRequestError'. ts(4078)

Решение состоит в том, чтобы избежать переназначения и напрямую ссылаться на переменные:

import errors from './errors';

export function doSomething(err: errors.http.BadRequestError): void { ... }
...