重写类型
在大多数情况下,NAPI-RS 会为你生成正确的 TypeScript 类型,但在某些情况下,你可能想要重写参数或返回值的类型。
ThreadsafeFunction 是一个例子,因为 ThreadsafeFunction
太复杂了,NAPI-RS 无法为其生成正确的 TypeScript 类型。你总是需要重写它的参数类型。
ts_args_type
重写函数的参数类型,NAPI-RS 会将重写的类型放在函数签名的括号中。
#[napi(ts_args_type="callback: (err: null | Error, result: number) => void")]
fn call_threadsafe_function(callback: JsFunction) -> Result<()> {
let tsfn: ThreadsafeFunction<u32, ErrorStrategy::CalleeHandled> = callback
.create_threadsafe_function(0, |ctx| {
ctx.env.create_uint32(ctx.value + 1).map(|v| vec![v])
})?;
for n in 0..100 {
let tsfn = tsfn.clone();
thread::spawn(move || {
tsfn.call(Ok(n), ThreadsafeFunctionCallMode::Blocking);
});
}
Ok(())
}
⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️
export function callThreadsafeFunction(
callback: (err: null | Error, result: number) => void,
): void
ts_arg_type
单独 重写函数的一个或多个参数类型,NAPI-RS 会将重写的类型放在函数签名的括号中,并自动推导其他类型。
#[napi]
fn override_individual_arg_on_function(
not_overridden: String,
#[napi(ts_arg_type = "() => string")] f: JsFunction,
not_overridden2: u32,
) {
// code ...
}
export function overrideIndividualArgOnFunction(
notOverridden: string,
f: () => string,
notOverridden2: number,
): string
ts_return_type
重写函数的返回类型,NAPI-RS 会将重写的类型添加到函数签名的末尾。
#[napi(ts_return_type="number")]
fn return_something_unknown(env: Env) -> Result<JsUnknown> {
env.create_uint32(42).map(|v| v.into_unknown())
}
export function returnSomethingUnknown(): number
ts_type
覆盖结构体中字段生成的 ts 类型。
#[napi(object)]
pub struct TsTypeChanged {
#[napi(ts_type = "MySpecialString")]
pub type_override: String,
#[napi(ts_type = "object")]
pub type_override_optional: Option<String>,
}
export interface TsTypeChanged {
typeOverride: MySpecialString
typeOverrideOptional?: object
}