Вызывает ли использование неизвестного типа в библиотеке машинописи все иждивенцы использовать машинописную версию 3.0 или выше? - PullRequest
3 голосов
/ 04 июня 2019

Мне интересно, если использование unknown в моих экспортированных типах в пакете, распространяемом через npm, заставит любой код, который зависит от этой библиотеки, использовать машинописный текст 3.0.unknown был добавлен в машинописный текст 3.0 (https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-0.html). Я определяю и экспортирую класс, у которого есть метод, который принимает unknown в качестве аргумента, а ключевое слово unknown отображается в сгенерированном файле d.ts.

Могут ли старые компиляторы машинописи обрабатывать тип unknown в сгенерированном d.ts, или я заставляю всех, кто использует мой пакет, использовать машинописный текст 3.0 или новее? Должен ли я использовать any вместо этого?способ «пропустить» этот отсутствующий тип для более старых версий машинописи?

1 Ответ

1 голос
/ 04 июня 2019

Старые компиляторы TypeScript не могут обрабатывать unknown.Вот метод шим, который удивительно работает.

  1. Создайте следующий файл shim.d.ts.
  2. Ссылка на этот файл в основном файле вашей библиотеки.

shim.d.ts

declare global {
    // @ts-ignore
    export type unknown = any;
}

export { }

index.ts

/// <reference path="shim.d.ts" />

/**
 * This is a tiny demo function that returns `unknown`. Your actual module
 * could include a lot more functionality.
 */
export default (): unknown => {
    return {} as unknown;
};

Когда потребитель вашей библиотеки компилирует более старую версию TypeScript,компилятор создаст новый тип с именем unknown, который является псевдонимом для any.Когда потребитель вашей библиотеки компилируется с более поздней версией TypeScript, компилятор не будет создавать новый тип, но из-за этого хитрого @ts-ignore компилятор также не будет жаловаться.

Вот демонстрационная версия этого на работе.

Как указано в комментариях jcalz, вместо any мы могли бы использовать псевдоним {} | null | undefined | void вместо

.
...