AiOffice 能力组合,开箱即用,为您的工作流提速
类型注释 (:Type) 验证值是否符合类型。类型断言(作为 Type)告诉 TypeScript 信任您。
将 JavaScript 迁移到 TypeScript 时,请遵循依赖关系图:从叶模块(没有依赖关系的模块)开始,然后向上工作。这可以确保当您转换模块时,其所有依赖项都已键入。这可以最大限度地减少类型错误并使迁移易于管理。
模块扩充允许您向现有模块添加声明,包括第三方库。当库的类型不完整或使用插件扩展库时,这非常有用。使用声明模块向现有模块添加属性、方法或类型。
可选属性很方便,但成本很高。
在 TypeScript 中迭代对象非常棘手。 for...in 循环将键推断为字符串而不是对象的键,从而导致索引错误。发生这种情况是因为对象可以具有超出其声明类型(结构类型)的其他属性,并且 for...in 包括继承的属性。
索引签名不精确。请改用接口、记录或映射。
泛型类型是值空间中函数的类型级别等效项。正如函数接受参数并返回值一样,泛型类型接受类型参数并生成具体类型。这种心理模型通过应用与编写函数相同的原则来帮助您编写更好的泛型类型:约束输入、选择好的名称和记录行为。
使用 never 来确保联合中的所有案例都得到处理。
有时,您需要一种类型,其中必须存在多个属性中的一个,但不能超过一个。这种“异或”(XOR) 模式在组件 props、API 参数和配置对象中很常见。对 never 类型使用可选属性会在编译时强制执行此约束。
对象字面量得到特殊对待:TypeScript 标记未知属性。
有些变量以宽泛类型开始,随着 TypeScript 看到的值的添加而变窄。
您的编辑器是您最好的 TypeScript 学习工具。
TypeScript 包括枚举和命名空间等特定于 TypeScript 且 JavaScript 中不存在的功能。尽可能选择标准 ECMAScript 功能 - 它们更可移植,可以更好地被 JavaScript 生态系统理解,并且不会将您锁定在 TypeScript 特定的模式中。
类型名称应该传达含义,而不是结构。
当 TypeScript 无法推断泛型类型时,请创建新的推断机会。
在一条语句中构建对象,而不是逐个构建对象。
默认情况下,TypeScript 中的条件类型分布在联合上。这通常是您想要的,但有时它会导致令人惊讶的行为。了解如何控制分发(在不需要时阻止它并在需要时启用它)对于高级类型级编程至关重要。
如果您创建别名,请一致使用它。
有时,最好的类型级代码就是根本没有类型级代码。当类型变得极其复杂时,当它们镜像外部模式(API、数据库、协议)时,或者当它们需要与不断变化的外部源保持同步时,代码生成通常是比复杂的类型级编程更好的解决方案。
TypeScript 编译和类型检查是单独的过程。