基础
// 默认导出。一个模块只能出现一个默认导出export default "foo";// 导入使用,默认名随便写import f from "./count.ts";
console.log(f);export function count(n1: number, n2: number): number { return n1 + n2;}
export let x = 10;export let y = 20;
export const arr = [1, 2, 3, 4, 5];import { count, x, y, arr } from "./count.ts";
console.log(count(1, 2));console.log(x);console.log(y);console.log(arr);function count(n1: number, n2: number): number { return n1 + n2;}
let x = 10;let y = 20;
const arr = [1, 2, 3, 4, 5];
export { count, x, y, arr };import { count as counter, x, y, arr } from "./count.ts";
console.log(counter(1, 2));console.log(x);console.log(y);console.log(arr);查看所有导出
Section titled “查看所有导出”export default { name: "admin",};
function count(n1: number, n2: number): number { return n1 + n2;}
const arr = [1, 2, 3, 4, 5];
export { count, arr };import * as a from "./count.ts";
console.log(a);// [Module: null prototype] {// arr: [ 1, 2, 3, 4, 5 ],// count: [Function: count],// default: { name: 'admin' }// }if (true) { import("./count.ts").then((module) => { console.log(module.default); console.log(module.count(10, 20)); console.log(module.arr); });}function count(n1: number, n2: number): number { return n1 + n2;}
const arr = [1, 2, 3, 4, 5];
export { count, arr };declare module "counter" { interface Counter { count(n1: number, n2: number): number; arr: number[]; } const counter: Counter; export default counter;}Mixins 混入
Section titled “Mixins 混入”interface A { name: string;}
interface B { age: number;}
let a: A = { name: "admin",};
let b: B = { age: 18,};
// 合并
// 1. 扩展运算符:浅拷贝,返回一个新的类型:{age: number;name: string;}const c1 = { ...a, ...b,};
// 2. Object.assign:浅拷贝,交叉类型:A & Bconst c2 = Object.assign(a, b);
// 3. structuredClone:深拷贝,返回一个新的类型:{age: number;name: string;}const c3 = structuredClone({ ...a, ...b,});// A类和B类合并到一起class Logger { log(message: string) { console.log(message); }}
class Html { render() { console.log("render"); }}
class App { run() { console.log("run"); }}
type Constructor<T> = new (...args: any[]) => T;
function pluginMixins<T extends Constructor<App>>(Base: T) { return class extends Base { private logger = new Logger(); private html = new Html();
constructor(...args: any[]) { super(...args); this.logger = new Logger(); this.html = new Html(); }
run(): void { this.logger.log("Running app"); }
render(): void { this.html.render(); } };}
const mixins = pluginMixins(App);
const app = new mixins();app.run();app.render();Decorator 装饰器
Section titled “Decorator 装饰器”发布订阅模式
Section titled “发布订阅模式”const cb = () => { console.log("asd callback...");};
// 监听器document.addEventListener("asd", cb, { // 只触发一次 once: true,});
// 订阅中心const event = new Event("asd");
// 派发器document.dispatchEvent(event);
// 移除监听器document.removeEventListener("asd", cb);// 实现once、on、off、emit方法interface I { events: Map<string, Function[]>; on: (event: string, callback: Function) => void; emit: (event: string, ...args: any[]) => void; once: (event: string, listener: Function) => void; off: (event: string, listener: Function) => void;}
class Emitter implements I { events: Map<string, Function[]>;
constructor() { this.events = new Map(); }
on(event: string, callback: Function) { if (!this.events.has(event)) { this.events.set(event, [callback]); } this.events.get(event)?.push(callback); }
emit(event: string, ...args: any[]) { const listeners = this.events.get(event); if (listeners) { listeners.forEach((listener) => listener(...args)); } }
once(event: string, listener: Function) { const onceListener = (...args: any[]) => { listener(...args); this.off(event, onceListener); }; this.on(event, onceListener); }
off(event: string, listener: Function) { const listeners = this.events.get(event); if (listeners) { this.events.set( event, listeners.filter((l) => l !== listener), ); } }}
const bus = new Emitter();const fn = (bool: boolean, num: number) => { console.log(3, bool, num);};bus.on("message", (bool: boolean, num: number) => { console.log(1, bool, num);});
bus.on("message", (bool: boolean, num: number) => { console.log(2, bool, num);});
bus.once("msg", fn);
console.log(bus);
bus.emit("message", false, 1);bus.emit("message", false, 1);bus.emit("message", false, 1);
bus.on("msg", fn);bus.off("msg", fn);