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;
我有一个 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;