Машинопись объявляет сторонние модули

Как я могу объявить сторонний модуль, который выглядит так:

в стороннем модуле:

module.exports = function foo(){
  // do somthing
}

в моем коде:

import * as foo from 'foo-module'; // Can not find a declaration module for ...
foo();

person Saman Mohamadi    schedule 18.05.2017    source источник


Ответы (3)


Ознакомьтесь с документацией по работе со сторонними модулями < / а>.

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

Приведенный вами пример - это модуль CommonJS (module.exports = ...), который на самом деле не является допустимым модулем ES6, потому что ES6 не может экспортировать функцию как модуль (он может экспортировать только члены функции или функция по умолчанию).

Обновление для TypeScript 2.7+

С добавленным _ 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();

В документации есть хороший ресурс по файлам объявлений и некоторые шаблоны для различных типов файлов объявлений.

person Aaron Beall    schedule 19.05.2017
comment
Что произойдет, если 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';
person Michael Klishevich    schedule 15.02.2019

Вы объявляете эту функцию:

Объявите var foo: any;

Это сообщит Typescript, что где-то у вас есть функция с именем foo, которую вы обязательно внедрите на сайт.

person Poku    schedule 18.05.2017