如何在本地项目中为javascript库创建类型定义?

时间:2018-05-14 23:15:24

标签: typescript

我正在尝试在打字稿项目中使用N3库。 README上的示例javascript代码如下所示。

const N3 = require('n3');
const { DataFactory } = N3;
const { namedNode, literal, defaultGraph, quad } = DataFactory;
const myQuad = quad(
  namedNode('https://ruben.verborgh.org/profile/#me'),
  namedNode('http://xmlns.com/foaf/0.1/givenName'),
  literal('Ruben', 'en'),
  defaultGraph(),
);

在打字稿中,我陷入了第一步。在我的项目的根目录中,我有一个名为main.ts的文件,其中包含以下内容。

import * as N3 from "n3";

但我收到错误“找不到模块'n3的声明文件'”

这是我被困的地方。 DefinitelyTyped中的类型定义是旧的并且已过时,因此我无法使用它们。我正在尝试为库创建自己的类型定义,但我无法弄清楚如何执行此操作。是否可以创建驻留在我的本地项目中的类型定义文件(即不在node_modules?中)。我试图以几种方式做到这一点但没有成功。有没有办法做到这一点?处理这种情况的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以在编译时包含的单独文件中为n3创建模块声明(例如.d.ts文件)。

declare module 'n3' {
   export interface Foo {} // replace with real interface/method declarations.
}

一种常见的模式是使用命名空间声明事物,然后将命名空间导出为模块。这允许从命名空间引用类型而无需导入任何内容。

declare namespace N3 {
    interface Foo {} // replace with real interface/method declarations.
}

declare module 'n3' {
    export = N3;
}

现在,您可以通过import语句或直接从命名空间引用类型。

import {Foo} from 'n3'; // Import type from module
let foo:N3.Foo = {}; // Use type directly from namespace