跳到主要内容
返回知识库
前端架构#TypeScript#Angular#Signal#状态管理

TypeScript 与 Angular Signal 状态模式

用只读派生状态、不可变更新和明确类型边界组织 Angular 组件的本地状态。

2026年7月12日 1 分钟阅读

Signal 适合表达组件内部同步状态。原始状态保持最小,派生值使用 computed(),更新通过 set() 或 update() 完成,这样状态变化更容易跟踪和测试。

import { computed, signal } from '@angular/core';

interface Article {
  readonly slug: string;
  readonly title: string;
  readonly tags: readonly string[];
}

export class ArticleFilterState {
  private readonly articles = signal<readonly Article[]>([]);
  readonly selectedTag = signal<string | null>(null);

  readonly visibleArticles = computed(() => {
    const tag = this.selectedTag();
    return tag ? this.articles().filter((article) => article.tags.includes(tag)) : this.articles();
  });

  selectTag(tag: string): void {
    this.selectedTag.update((current) => (current === tag ? null : tag));
  }

  replaceArticles(articles: readonly Article[]): void {
    this.articles.set([...articles]);
  }
}

约束清单

  • 状态类型使用具体接口或联合类型,不用 any
  • 派生状态只读取其他 signal,不在 computed() 中产生副作用
  • 数组与对象采用不可变更新,不依赖原地修改
  • 异步请求与取消逻辑放到服务边界,不塞进模板表达式
  • 模板调用只保留轻量读取,复杂筛选提前派生

当状态需要跨越多个功能域、持久化或协调复杂异步流程时,应重新评估边界。Signal 是响应式原语,不必承担整个应用的数据层职责。