Написание файла объявления машинописного текста для внешнего пакета js nodejs без информации о типе - PullRequest
2 голосов
/ 23 октября 2019

Я пишу библиотеку узлов js typcript (для использования в контексте приложения cli), которая зависит от библиотеки js jinxed, в которой нет объявлений типов машинописи. Я следил за информацией в файлах объявлений Typescript

jinxed - простая библиотека, которая в настоящее время экспортирует одну функцию через module.exports {...}, этоне предназначен для единственного экспорта из библиотеки (поскольку он будет расширен в будущем). Таким образом, экспортируемая функция является членом объекта экспорта.

Проблема в том, как мне использовать это в библиотеке машинописи. После прочтения всей документации объявления машинописного текста мне все еще не ясно, как это сделать.

Первая проблема, которую необходимо решить, - какой шаблон объявления выбрать из Шаблоны файлов объявлений машинописного текста .

Я решил, что соответствующий шаблон, который нужно использовать для включения использования jinxed из машинописного текста, - module.d.ts (хотя я исправляюсь).

Так что мой клиентский машинописный текстбиблиотека (виджет) выглядит следующим образом:

widget/
  lib/
    externalTypes/
      jinxed/
        index.d.ts
    index.ts

Итак, выше показано, как я определяю файл типа для внешней зависимости, сглаженной в соответствии с инструкциями в файле шаблона;т.е. создайте папку, имя которой совпадает с именем внешней зависимости, и поместите в нее файл index.d.ts.

widget / lib / externalTypes / jinxed / index.d.ts:

функция экспорта functify (obj: any): строка;

на стороне потребления;то есть внутри моего файла index.ts (widget / lib / index.ts):

/// <reference types="./externalTypes/jinxed" />

import jinxed = require('jinxed');

const TestObject:any = {
  name: 'dvorak',
  occ: 'watchman'
};

jinxed.functify(TestObject);

[PS: я также пытался:

let jinxed = require ('. / externalTypes / Jinxed ');(... но это просто приводит к ошибке при использовании обязательного комментария)

]

Но при компиляции выдается следующее сообщение об ошибке:

ОШИБКА в /Users/User/dev/github/js/widget/lib/index.ts ./lib/index.ts [tsl] ОШИБКА в

/ Users / Пользователь / dev / github / js/widget/lib/index.ts(4,25) TS7016: Не удалось найти файл объявлений для модуля 'jinxed'. '/Users/User/dev/github/js/widget/node_modules/jinxed/index.js' неявно имеет тип 'any'.

(извинения за сообщение об ошибке выглядит несколько уродливо,вопросы форматирования)

[

А для полноты содержания jinxed выглядит следующим образом:

'use strict';

function functify (obj) {
  return JSON.stringify(obj, (key, val) => {
    return (typeof val === 'function') ? '_function_' : val;
  });
}

module.exports = {
  functify: functify
}

]

Сообщение об ошибкеуказывает на то, что он не может найти файл объявления для jinxed, но я использовал

 /// <reference...

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

Зависимости в виджете packaage.json следующие:

  "dependencies": {
    "@types/ramda": "^0.26.19",
    "jinxed": "0.0.1",
    "ramda": "^0.26.1",
    "xpath": "0.0.27"   },

Файл tsconfig:

{
  "compilerOptions": {
    "allowJs": true,
    "alwaysStrict": true,
    "module": "commonjs",
    "moduleResolution": "Node",
    "noImplicitAny": true,
    "sourceMap": true,
    "strictNullChecks": true,
    "target": "es5",
    "types": [],
    "lib": [
      "es5",
      "es2015",
      "es6",
      "dom"
    ]
  },
  "include": [
    "lib/**/*"
  ],
  "exclude": [
    "node_modules",
    "**/*.spec.ts"
  ]
}

Запись "main" в package.json:

"main": "./lib/index.ts",

Кроме того, я хотел бы знать, представляется ли разумным способ, которым я структурировал зависимости внешних типов. IE, скажем, я пытаюсь использовать другую внешнюю библиотеку js аналогично тому, как показано выше для jinxed;Я предположил бы, что я создам другую папку в externalTypes, которая соответствует имени этой зависимости, и заполню ее собственным index.d.ts. Это правильно, или я лаю не на том дереве?

РЕДАКТИРОВАТЬ: (Я нашел решение этой проблемы с помощью этой проблемы , но я на самом деле не понимаю пользователей.

В index.d.ts я обновил его следующим образом:

declare module 'jinxed' {
  export function functify(obj: any): string;
}

... и это действительно работает.

Однако я непонять оператор объявление модуля , в частности, почему имена jinxed находятся внутри кавычек (удалите кавычки, и вы получите ошибку: TS7016: не удалось найти файл объявления для модуля 'jinxed'). Пока я не нашел правильный шаблон машинописи, которому он соответствует, поэтому я не могу получить хорошее объяснение того, почему это работает.

1 Ответ

1 голос
/ 23 октября 2019

Похоже, вы нашли ответ на свой первоначальный вопрос, но я подумал, что поделюсь некоторыми ресурсами относительно вашего второго вопроса. Из документов машинописного текста: Ambient Modules

В Node.js большинство задач выполняется путем загрузки одного или нескольких модулей. Мы можем определить каждый модуль в своем собственном файле .d.ts с декларациями экспорта верхнего уровня, но удобнее записать их как один больший файл .d.ts. Для этого мы используем конструкцию, аналогичную пространствам имен окружения, но мы используем ключевое слово модуля и имя модуля в кавычках, которое будет доступно для последующего импорта.

Язык declare module является языкомключевые слова, а строка - это имя импортируемого модуля.

...