Я использую библиотеку напрямую через unpkg и пытаюсь заставить проверку типов работать во время разработки.
// src/modules/preact.js
// @ts-ignore
export * from "https://unpkg.com/preact@latest?module";
// @ts-ignore
export * from "https://unpkg.com/preact@latest/hooks/dist/hooks.module.js?module";
Поскольку TypeScript не может разрешить удаленные URL-адреса, я также установил копия библиотеки для разработки и добавленный файл декларации.
// src/modules/preact.d.ts
export * from "preact";
export * from "preact/hooks";
// node_modules/preact/src/index"' uses 'export =' and cannot be used with 'export *'. [2498]
Это не работает, потому что локальные типы экспортируют общие js, тогда как unpkg обслуживает esm.
// node_modules/preact/src/index.d.ts
export = preact;
export as namespace preact;
import { JSXInternal } from './jsx';
declare namespace preact {
// ...
Есть ли способ превратить общий js в es в файле декларации?
Сейчас я использую реэкспорт вручную в качестве обходного пути:
// src/modules/preact.d.ts
import * as preact from "preact";
import * as hooks from "preact/hooks";
export let h: typeof preact.h;
export let render: typeof preact.render;
export let Fragment: typeof preact.Fragment;
export let createContext: typeof preact.createContext;
export let useEffect: typeof hooks.useEffect;
export let useRef: typeof hooks.useRef;
export let useState: typeof hooks.useState;
export let useReducer: typeof hooks.useReducer;
export let useMemo: typeof hooks.useMemo;
export let useCallback: typeof hooks.useCallback;
В идеале я мог бы выполнить сопоставление непосредственно в paths
в моем tsconfig, но это ограничивает совместимость модулей таким же образом (без обходного пути, который я могу найти).
{
"compilerOptions": {
"target": "esnext",
"noEmit": true,
"allowJs": true,
"checkJs": true,
"baseUrl": ".",
"paths": {
"https://unpkg.com/preact@latest?module": ["node_modules/preact/src/index.d.ts"],
"https://unpkg.com/preact@latest/hooks/dist/hooks.module.js?module": ["node_modules/preact/hooks/src/index.d.ts"]
}
},
"include": [
"**/*.d.ts",
"**/*.js",
]
}