Node C++插件的Typescript声明文件

11

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

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

现在我想使用TypeScript来完成同样的工作。我找不到合适的.d.ts文件和导入语句组合来使它正常运行。我猜最理想的情况是声明我的类位于模块中,并且具有一个接受字符串的构造函数。然后我只需要执行:

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

有人见过这方面的任何例子吗?

4个回答

17

我想我终于搞明白了。如@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')

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

// 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"从模块的其他部分使用它。


这个可以运行,但是 OP 要求 TypeScript 声明文件。(我不是那个给你踩反对票的人) - sziraqui

1
如果您需要进行环境声明(如我所做的那样,因为我正在使用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';

我有点困惑。您是将此添加到客户端应用程序(例如消耗扩展的Electron应用程序)中,还是将其添加到插件所在的文件夹中?并且您要将此文件放置在项目文件夹的哪个位置? - Hari Mahadevan
Node.js 不支持原生模块的 import ... 语法。 - Gurwinder Singh

0

另一种方法是类似于尼克·卡伦的方式。

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

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

当被编译成JavaScript时,它将把文件看作 hello.node。TypeScript会将文件视为其名称+TypeScript文件扩展名。

因此,这就是你的 *.node 目录应该看起来的样子:

-hello.node

-hello.node.d.ts

-if-windows-hello.dll

在我的 hello.node.d.ts 文件中,我有:
export const hello: () => string;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接