feat(framework): core 响应式 signal 基元(自研薄封装)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-28 21:32:03 +08:00
co-authored by Claude Opus 4.8
parent 1ed00a520e
commit 854d72a420
2 changed files with 76 additions and 0 deletions
@@ -0,0 +1,31 @@
export type Unsubscribe = () => void;
export interface ReadonlyReactive<T> {
readonly value: T;
subscribe(fn: (value: T, prev: T) => void): Unsubscribe; // 返回退订函数
}
export interface Reactive<T> extends ReadonlyReactive<T> {
value: T; // 可写
}
/** 极小响应式信号:value 读写 + 订阅。Object.is 判等(值未变不通知);订阅者抛错隔离。 */
export function signal<T>(initial: T): Reactive<T> {
let current = initial;
const subs = new Set<(value: T, prev: T) => void>();
return {
get value(): T { return current; },
set value(v: T) {
if (Object.is(v, current)) return;
const prev = current;
current = v;
for (const fn of [...subs]) {
try { fn(current, prev); } catch (e) { console.error('[reactive] subscriber error:', e); }
}
},
subscribe(fn: (value: T, prev: T) => void): Unsubscribe {
subs.add(fn);
return () => { subs.delete(fn); };
},
};
}