Я пишу библиотеку узлов 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'). Пока я не нашел правильный шаблон машинописи, которому он соответствует, поэтому я не могу получить хорошее объяснение того, почему это работает.