news 2026/9/21 23:31:10

TypeScript语法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TypeScript语法

这些是MobX-State-Tree (MST)​ 的核心语法,用于定义可观察的状态树模型。我来详细解释每个部分:

1.types对象的作用

types是 MST 库导出的类型构建器集合,用于定义数据模型的形状、验证规则和行为。

import { types } from "mobx-state-tree"; // types 提供的方法: types.model() // 定义数据模型 types.compose() // 组合多个模型 types.string // 字符串类型 types.number // 数字类型 types.boolean // 布尔类型 types.array // 数组类型 types.map // Map类型 types.optional() // 可选类型 types.union() // 联合类型 types.literal() // 字面量类型 // ...等等

2.Validation模型 - 验证规则定义

const Validation = types.model({ controlledTags: Types.unionTag(["Image"]), });

作用和解释

// 等价于: const Validation = { controlledTags: "只能与 'Image' 标签配合使用" }; // 这定义了: // 1. 验证规则:RectangleLabels 必须与 Image 标签一起使用 // 2. 类型约束:controlledTags 必须是 "Image" 类型 // 3. 运行时检查:如果配置错误会报错

实际应用场景

<!-- ✅ 正确的配置 --> <View> <RectangleLabels name="labels" toName="image"> <Label value="Person" /> </RectangleLabels> <Image name="image" value="$image" /> <!-- 必须有Image标签 --> </View> <!-- ❌ 错误的配置(会触发验证错误) --> <View> <RectangleLabels name="labels" toName="text"> <!-- 指向了Text而不是Image --> <Label value="Person" /> </RectangleLabels> <Text name="text" value="$text" /> <!-- 这里是Text,不是Image --> </View>

3.ModelAttrs模型 - 核心属性定义

const ModelAttrs = types.model("RectangleLabelsModel", { pid: types.optional(types.string, guidGenerator), // 属性1 type: "rectanglelabels", // 属性2 children: Types.unionArray(["label", "header", "view", "hypertext"]), // 属性3 });

详细分解

属性

类型定义

解释

示例值

pid

types.optional(types.string, guidGenerator)

可选字符串,默认用guidGenerator()生成唯一ID

"abc123-def456"

type

字面量字符串

固定类型标识,用于序列化/反序列化

"rectanglelabels"

children

Types.unionArray([...])

联合数组,只能包含指定的几种类型元素

["label", "view"]

Types.unionArray的工作原理

// 内部实现类似: const unionArray = (allowedTypes) => { return types.array( types.union({ dispatcher: (snapshot) => { if (snapshot.type === "label") return LabelModel; if (snapshot.type === "header") return HeaderModel; if (snapshot.type === "view") return ViewModel; if (snapshot.type === "hypertext") return HypertextModel; } }) ); };

4.types.compose()- 模型组合(Mixin模式)

const Composition = types.compose( ControlBase, // 第1层:基础控制功能 LabelsModel, // 第2层:标签管理功能 ModelAttrs, // 第3层:自定义属性 RectangleModel, // 第4层:矩形绘制功能 Validation, // 第5层:验证规则 LabelMixin, // 第6层:标签混入 SelectedModelMixin.props({ _child: "LabelModel" }), // 第7层:选中状态 );

组合的工作原理

flowchart TD A[“types.compose”] --> B[“模型继承链”] B --> C[“ControlBase<br>基础功能”] C --> D[“LabelsModel<br>标签管理”] D --> E[“ModelAttrs<br>自定义属性”] E --> F[“RectangleModel<br>矩形功能”] F --> G[“Validation<br>验证规则”] G --> H[“LabelMixin<br>标签混入”] H --> I[“SelectedModelMixin<br>选中状态”] I --> J[“最终组合模型<br>拥有所有层的功能”] J --> K[“属性合并<br>方法继承<br>验证叠加”]

组合规则

  1. 属性合并:后面模型的属性会覆盖前面同名属性

  2. 方法继承:所有模型的方法都会被继承

  3. 验证叠加:所有验证规则都会生效

5.实际模型结构示例

组合后的完整模型结构如下:

// 组合后的 RectangleLabelsModel 包含: { // 来自 ControlBase name: string, toName: string, // ...其他基础属性 // 来自 LabelsModel labels: Array<Label>, selectedLabels: Array<Label>, // ...标签管理方法 // 来自 ModelAttrs pid: string, // 自动生成的唯一ID type: "rectanglelabels", // 固定类型 children: Array<label | header | view | hypertext>, // 来自 RectangleModel x: number, y: number, width: number, height: number, rotation: number, // ...矩形绘制方法 // 来自 Validation controlledTags: "Image", // 验证规则 // 来自 LabelMixin labelActions: Object, // 标签相关操作 // 来自 SelectedModelMixin selected: boolean, select(): void, unselect(): void, // ...选中状态管理 }

6.MST 类型系统的优势

// 1. 强类型检查 const model = RectangleLabelsModel.create({ type: "rectanglelabels", children: ["label", "text"] // ❌ 错误:'text' 不在允许的列表中 }); // 2. 运行时验证 const model = RectangleLabelsModel.create({ type: "rectangle", // ❌ 错误:type必须是"rectanglelabels" }); // 3. 自动序列化 const snapshot = getSnapshot(model); // 输出:{ pid: "abc123", type: "rectanglelabels", ... } // 4. 不可变更新 const newModel = applySnapshot(model, { ...snapshot, x: 100 }); // 5. 响应式观察 autorun(() => { console.log(model.selected); // 自动追踪依赖 });

7.完整的类型继承链示例

// 假设各个基础模型的定义: const ControlBase = types.model({ name: types.string, toName: types.string, }); const LabelsModel = types.model({ labels: types.array(LabelModel), }); const RectangleModel = types.model({ x: types.number, y: types.number, width: types.number, height: types.number, }); // 组合时相当于: const RectangleLabelsModel = types.model("RectangleLabelsModel", { // 来自 ControlBase name: types.string, toName: types.string, // 来自 LabelsModel labels: types.array(LabelModel), // 来自 ModelAttrs pid: types.optional(types.string, guidGenerator), type: "rectanglelabels", children: Types.unionArray(["label", "header", "view", "hypertext"]), // 来自 RectangleModel x: types.number, y: types.number, width: types.number, height: types.number, // 来自 Validation controlledTags: Types.unionTag(["Image"]), // 来自 LabelMixin 和 SelectedModelMixin 的方法 // ...actions, views, etc. }).actions(self => ({ // 来自各个模型的方法 fromControlBase() { /* ... */ }, fromLabelsModel() { /* ... */ }, fromRectangleModel() { /* ... */ }, }));

总结

types是 MST 的类型系统核心,它提供了:

  1. types.model()​ - 定义数据结构形状

  2. types.compose()​ - 组合多个模型(类似多重继承)

  3. 类型检查器​ - 确保数据符合定义

  4. 运行时验证​ - 在创建和更新时验证数据

  5. 序列化支持​ - 自动转换为纯JS对象

这种架构的优势

  • 强类型安全:减少运行时错误

  • 代码复用:通过组合复用功能

  • 可维护性:清晰的关注点分离

  • 开发体验:优秀的TypeScript支持

  • 性能优化:精确的响应式更新

这就是为什么 Label Studio 选择 MST 来构建其复杂的状态管理系统——它提供了类型安全、可组合性和响应式更新的完美结合。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/21 21:49:30

agent-zh.md

你是一个 AI 助手&#xff0c;帮助用户完成各种任务&#xff0c;包括编程、研究和分析。 核心角色 你的核心角色和行为可能会根据用户反馈和指示进行更新。当用户告诉你应该如何表现或你的角色应该是什么时&#xff0c;立即更新此记忆文件以反映该指导。 记忆优先协议 你可以访…

作者头像 李华
网站建设 2026/9/22 2:14:12

为什么过滤 rtmpt 而不是 rtmp?

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a;不…

作者头像 李华
网站建设 2026/9/22 2:14:05

Navicat x 达梦技术指引 | 启用和配置AI助手

近期&#xff0c;Navicat 宣布正式支持国产达梦数据库。Navicat 旗下全能工具 支持达梦用户的全方位管理开发需求&#xff0c;而轻量化免费的 则满足小型和独立开发者的基础需求。 Navicat Premium 自版本 17.3 开始支持达梦 DM8 或以上版本。它支持的系统有 Windows、Linux …

作者头像 李华
网站建设 2026/9/20 22:56:10

Transformer的注意力权重的理解

""" Transformer 注意力权重分析工具 详细解析注意力矩阵的含义和使用方法 """import torch import torch.nn as nn import numpy as np import math# # 简化的多头注意力&#xff08;用于演示&#xff09; # class SimpleMultiHeadAttention(…

作者头像 李华
网站建设 2026/9/21 5:47:18

解构 Codigger:从内核到无限生态的“进化阶梯”

当下开发工具市场繁杂又高度同质化&#xff0c;Codigger 却格外亮眼。它没有止步于单点工具的定位&#xff0c;而是成长为一个设计精巧、层层推进的技术有机体。从架构全景来看&#xff0c;它更像一套严谨的进化阶梯&#xff0c;六大核心层级彼此联动&#xff0c;共同构建出强悍…

作者头像 李华
网站建设 2026/9/22 1:37:44

基于Python的高考志愿报名推荐系统源码设计与文档

前言 在高考志愿填报精细化需求提升、传统填报模式存在 “数据维度单一、匹配精准度低、政策解读滞后、风险评估不足” 的痛点背景下&#xff0c;基于 Python 的高考志愿报名推荐系统构建具有重要的教育与实用价值&#xff1a;从数据处理层面&#xff0c;系统依托 Python 的 Pa…

作者头像 李华