Node C++ Addon 的 Typescript 声明文件

Typescript declarations file for Node C++ Addon

我有一个 Node C++ 插件,它提供了一个类似于 Node 文档中的包装 class。我可以 require() 我的插件,然后获取我的 class 的构造函数来创建一个实例。

const { MyClass } = require('myaddon');
const obj = new MyClass('data');

现在我想用 TypeScript 来做同样的事情。我找不到 .d.ts 文件和导入语句的正确组合来完成这项工作。我想理想情况下我想声明我的 class 在模块中并且有一个接受字符串的构造函数。然后我可以这样做:

import { MyClass } from 'myaddon';
const obj = new MyClass('data');

人们见过这样的例子吗?

也许有更好的方法,但我使用以下模式:

// bindings.ts
// Declare the interface of your addon:
export interface MyBindings {
    myMethod1: (arg1: number) => null;
}
// Load it with require
var myClass: MyBindings = require("./build/release/myaddon");
export default myClass;

然后通过 import bindings from "../bindings" 在我的模块的其他部分使用它。

我想我终于拥有了它。正如@ZachB 所建议的,我创建了一个 myaddon.ts 文件,其中包含以下内容:

const myaddon = require('./build/release/myaddon')

export interface MyClass {
    myMethod(arg: string): number
}

export var MyClass: {
    new(param: string): MyClass
} = myaddon.MyClass

然后使用它:

import { MyClass } from 'myaddon'

const thing: MyClass = new MyClass('something')
const answer: number = thing.myMethod('blah')

如果你需要做一个环境声明,(因为我使用的是 Node-Gyp + Webpack),你可以添加一个 mymodule.d.ts:

declare module "*mymodule.node" {
    declare class SpaceItem {}

    declare class Item extends SpaceItem {
        GetItemName(): number;
        CreateMesh(StepData, FormNote, RegDuplicate?);
    }

    var Enabler: {
        EnableMathModules(string, string);
    };
}

然后需要这个

import mymodule from '../build/Release/mymodule.node';

另一种方法与 Nick Kallen 的方法类似。

您基本上是在使用命名技巧。如果你这样做:

import test = require("../test/build/Release/hello.node");

当 'compiled' 到 javascript 时,它会将文件视为 hello.node。 Typescript 会将文件视为其名称 + typescript 文件扩展名。

所以你的 *.node 目录应该是这样的:

-hello.node

-hello.node.d.ts

-if-windows-hello.dll

在我的 hello.node.d.ts 文件中我有:

export const hello: () => string;