Как я могу объявить сторонний модуль, который выглядит так:
в стороннем модуле:
module.exports = function foo(){
// do somthing
}
в моем коде:
import * as foo from 'foo-module'; // Can not find a declaration module for ...
foo();
Как я могу объявить сторонний модуль, который выглядит так:
в стороннем модуле:
module.exports = function foo(){
// do somthing
}
в моем коде:
import * as foo from 'foo-module'; // Can not find a declaration module for ...
foo();
Ознакомьтесь с документацией по работе со сторонними модулями < / а>.
Как написать декларацию, во многом зависит от того, как был написан модуль и что он экспортирует.
Приведенный вами пример - это модуль CommonJS (module.exports = ...
), который на самом деле не является допустимым модулем ES6, потому что ES6 не может экспортировать функцию как модуль (он может экспортировать только члены функции или функция по умолчанию).
С добавленным _ 2_ параметр компилятора, вам больше не нужно использовать" взлом пространства имен ", показанный ниже, для модулей CommonJS, экспорт которых не совместим с ES6.
Во-первых, убедитесь, что вы включили esModuleInterop
в своем tsconfig.json
(который теперь включен по умолчанию в tsc --init
):
{
"compilerOptions" {
...
"esModuleInterop": true,
...
}
}
Объявите свой foo-example
в .d.ts
файле следующим образом:
declare module "foo-module" {
function foo(): void;
export = foo;
}
Теперь вы можете импортировать его как пространство имен, как хотели:
import * as foo from "foo-module";
foo();
Или как импорт по умолчанию:
import foo from "foo-module";
foo();
Вы можете объявить свой foo-example
в файле .d.ts
следующим образом:
declare module "foo-module" {
function foo(): void;
namespace foo { } // This is a hack to allow ES6 wildcard imports
export = foo;
}
И импортируйте, как вы хотели:
import * as foo from "foo-module";
foo();
Или вот так:
import foo = require("foo-module");
foo();
В документации есть хороший ресурс по файлам объявлений и некоторые шаблоны для различных типов файлов объявлений.
foo()
уже вызывается внутри модуля, и в результате получается то, что экспортировано? Как это набрать?
- person Alper; 08.11.2020
У меня была похожая проблема. И изо всех сил пытался добавить определение типа в свой проект. Наконец я подумал.
Это какой-то модуль (только с константами), назовем его some-module
- node_modules / some-module / index.js.
'use strict';
exports.__esModule = true;
var APPS = exports.APPS = {
ona: 'ona',
tacq: 'tacq',
inetAcq: 'inetAcq'
};
Сначала добавляю в tsconfig.json baseUrl
и typeRoots
{
...
"compilerOptions": {
...
"baseUrl": "types",
"typeRoots": ["types"]
}
...
}
Во-вторых, в корне моего проекта я создаю папку types
с такой же структурой папок для модуля types/some-module/index.js
и помещаю код:
declare module 'some-module' {
type Apps = {
ona: string;
tacq: string;
inetAcq: string;
};
let APPS: Apps
}
Наконец-то я могу импортировать его в свой my-file.ts
с наборами!
import { APPS } from 'some-module';
Вы объявляете эту функцию:
Объявите var foo: any;
Это сообщит Typescript, что где-то у вас есть функция с именем foo, которую вы обязательно внедрите на сайт.