使用鸭子类型接口
在导入的方法、getter 和 setter 上大量使用 structural
属性 允许您定义鸭子类型接口。鸭子类型接口是指许多不同的 JavaScript 对象,它们在原型链中没有相同的基类,因此不是 instanceof
相同的基类,但可以以相同的方式使用。
在 Rust 中定义鸭子类型接口
#![allow(unused)] fn main() { use wasm_bindgen::prelude::*; /// Here is a duck-typed interface for any JavaScript object that has a `quack` /// method. /// /// Note that any attempts to check if an object is a `Quacks` with /// `JsCast::is_instance_of` (i.e. the `instanceof` operator) will fail because /// there is no JS class named `Quacks`. #[wasm_bindgen] extern "C" { pub type Quacks; #[wasm_bindgen(structural, method)] pub fn quack(this: &Quacks) -> String; } /// Next, we can export a function that takes any object that quacks: #[wasm_bindgen] pub fn make_em_quack_to_this(duck: &Quacks) { let _s = duck.quack(); // ... } }
JavaScript 用法
import { make_em_quack_to_this } from "./rust_duck_typed_interfaces";
// All of these objects implement the `Quacks` interface!
const alex = {
quack: () => "you're not wrong..."
};
const ashley = {
quack: () => "<corgi.gif>"
};
const nick = {
quack: () => "rappers I monkey-flip em with the funky rhythm I be kickin"
};
// Get all our ducks in a row and call into wasm!
make_em_quack_to_this(alex);
make_em_quack_to_this(ashley);
make_em_quack_to_this(nick);