AiOffice 能力组合,开箱即用,为您的工作流提速
TypeScript 的行为在很大程度上取决于配置。
您可以向 JavaScript 文件添加 TypeScript 类型检查,而无需将其转换为 TypeScript。在 JS 文件顶部使用 @ts-check 和 JSDoc 注释来添加类型。这使您可以逐渐尝试 TypeScript,而无需进行完全转换。
使用 TypeScript 类型时,三个版本必须保持一致:您正在使用的包的版本、其类型声明 (@types) 的版本以及 TypeScript 本身的版本。即使代码在运行时工作,这些版本之间的不一致也会导致令人困惑的类型错误。
正如为运行时代码编写测试一样,您应该为您的类型编写测试。类型级代码也可能存在错误,并且类型声明可能与实现不同步。测试类型可确保您的声明正确工作并捕获应有的错误。
TypeScript 限制类型实例化的深度以防止无限循环。当您遇到“类型实例化过深且可能无限”时,您需要将递归类型重构为尾递归。使用累加器模式,您可以编写 TypeScript 可以优化的类型,从而避免深度限制。
当接口具有联合类型属性时,接口的联合通常更好。
TypeScript 并不健全 - 运行时值可能与静态类型不同。
Unknown 是 any 的类型安全表亲。
类型注释 (:Type) 验证值是否符合类型。类型断言(作为 Type)告诉 TypeScript 信任您。
字符串类型非常庞大。尽可能使用较窄的类型。
类型注释是您的文档。不要在评论中重复它们。
将 JavaScript 迁移到 TypeScript 时,请遵循依赖关系图:从叶模块(没有依赖关系的模块)开始,然后向上工作。这可以确保当您转换模块时,其所有依赖项都已键入。这可以最大限度地减少类型错误并使迁移易于管理。
模块扩充允许您向现有模块添加声明,包括第三方库。当库的类型不完整或使用插件扩展库时,这非常有用。使用声明模块向现有模块添加属性、方法或类型。
可选属性很方便,但成本很高。
在 TypeScript 中迭代对象非常棘手。 for...in 循环将键推断为字符串而不是对象的键,从而导致索引错误。发生这种情况是因为对象可以具有超出其声明类型(结构类型)的其他属性,并且 for...in 包括继承的属性。
索引签名不精确。请改用接口、记录或映射。
正确的不精确类型比错误的精确类型要好。
泛型类型是值空间中函数的类型级别等效项。正如函数接受参数并返回值一样,泛型类型接受类型参数并生成具体类型。这种心理模型通过应用与编写函数相同的原则来帮助您编写更好的泛型类型:约束输入、选择好的名称和记录行为。
使用 never 来确保联合中的所有案例都得到处理。
有时,您需要一种类型,其中必须存在多个属性中的一个,但不能超过一个。这种“异或”(XOR) 模式在组件 props、API 参数和配置对象中很常见。对 never 类型使用可选属性会在编译时强制执行此约束。