TypeScript并不能将薄弱的工程实践转化为强大的工程实践。
严格的类型系统固然有帮助,但任何糟糕的边界定义以及未经测试的域规则依然会被使用——良好的设计远比语法重要。
类型安全与软件质量并非同一概念
TypeScript能够防止一类重要的错误,但它无法避免设计缺陷、不清晰的领域模型或粗疏的运行时行为。
function transferMoney(
from: Account,
to: Account,
amount: number
) {
from.balance -= amount;
to.balance += amount;
}
const user: any = fetchUser();
user.address.street.foo.bar();
interface User {}
interface UserResponse {}interface UserData {}interface UserDTO {}interface UserPayload {}interface UserState {}
TypeScript无法理解业务逻辑
编译器无法判断折扣叠加规则是否公平。类型仅能描述数据结构,真正需要通过测试和不变量来保障的仍是业务逻辑。
最危险的类型是any
any会让编译器这一强大的工具失去作用。建议使用unknown结合类型收窄机制,或采用精确的联合类型。
强大的类型也无法挽救薄弱的架构
合理的层次结构、清晰的边界以及模块间的衔接,远比用接口来勉强包装混乱的代码更重要。
类型用于描述现实世界
模型应与领域相匹配。那些在 API 返回 null 时却声称非空的类型会制造出虚假的可靠性。
在 TypeScript 中,不良习惯扩散得更快
复制粘贴的 DTO、过大的“上帝类”以及滥用断言的行为,都在“类型化”的表象下迅速蔓延。
最优秀的 TypeScript 开发者本就是严谨的 JavaScript 开发者
纪律先于语法。TypeScript 会放大各种习惯——无论是好的还是坏的。
将编译器视为合作伙伴
开启严格模式,解决根本问题,让错误引导代码重构而非将其掩盖。
真正的升级并非 TypeScript 本身
真正的提升在于更清晰的模块结构、经过测试的领域规则以及真实的类型定义。TypeScript 只是实现这些目标的工具,而非替代品。
在讨论风格指南之前,先启用 noImplicitAny 和 strictNullChecks;这两个标志能捕获更多实际错误,比命名规范更有效。
在边界处将 DTO 与映射器配对使用——不要仅仅因为两者都是“带类型的”,就让持久化结构泄露到 UI 组件中。
在讨论风格指南之前,先启用 noImplicitAny 和 strictNullChecks;这两个标志能捕获更多实际错误,比命名规范更有效。
在边界处将 DTO 与映射器配对使用——不要仅仅因为两者都是“带类型的”,就让持久化结构泄露到 UI 组件中。
在讨论风格指南之前,先启用 noImplicitAny 和 strictNullChecks;这两个标志能捕获更多实际错误,比命名规范更有效。
在边界处将 DTO 与映射器配对使用——不要仅仅因为两者都是“带类型的”,就让持久化结构泄露到 UI 组件中。
在讨论风格指南之前,先启用 noImplicitAny 和 strictNullChecks;这两个标志能捕获更多实际漏洞,比命名规范更有效。
在边界处将 DTO 与映射器配对使用——不要仅仅因为两者都是“带类型的”,就让持久化结构泄露到 UI 组件中。
在讨论风格指南之前,先启用 noImplicitAny 和 strictNullChecks;这两个标志能捕获更多实际漏洞,比命名规范更有效。
在边界处将 DTO 与映射器配对使用——不要仅仅因为两者都是“带类型的”,就让持久化结构泄露到 UI 组件中。
在讨论风格指南之前,先启用 noImplicitAny 和 strictNullChecks;这两个标志能捕获更多实际漏洞,比命名规范更有效。
在边界处将 DTO 与映射器配对使用——不要仅仅因为两者都是“带类型的”,就让持久化结构泄露到 UI 组件中。
在讨论风格指南之前,先启用 noImplicitAny 和 strictNullChecks;这两个标志能捕获更多实际漏洞,比命名规范更有效。
在边界处将 DTO 与映射器配对使用——不要仅仅因为两者都是“带类型的”,就让持久化结构泄露到 UI 组件中。
在讨论风格指南之前,先启用 noImplicitAny 和 strictNullChecks;这两个标志能捕获更多实际漏洞,比命名规范更有效。
在边界处将 DTO 与映射器配对使用——不要仅仅因为两者都是“带类型的”,就让持久化结构泄露到 UI 组件中。
在讨论风格指南之前,先启用 noImplicitAny 和 strictNullChecks;这两个标志能捕获更多实际漏洞,比命名规范更有效。
在边界处将 DTO 与映射器配对使用——不要仅仅因为两者都是“带类型的”,就让持久化结构泄露到 UI 组件中。
在讨论风格指南之前,先启用 noImplicitAny 和 strictNullChecks;这两个标志能捕获更多实际漏洞,比命名规范更有效。
在边界处将 DTO 与映射器配对使用——不要仅仅因为两者都是“带类型的”,就让持久化结构泄露到 UI 组件中。
在讨论风格指南之前,先启用 noImplicitAny 和 strictNullChecks;这两个标志能捕获更多实际漏洞,比命名规范更有效。
在边界处将 DTO 与映射器配对使用——不要仅仅因为两者都是“带类型的”,就让持久化结构泄露到 UI 组件中。
在讨论风格指南之前,先启用 noImplicitAny 和 strictNullChecks;这两个标志能捕获更多实际漏洞,比命名规范更有效。
在边界处将 DTO 与映射器配对使用——不要仅仅因为两者都是“带类型的”,就让持久化结构泄露到 UI 组件中。
在讨论风格指南之前,先启用 noImplicitAny 和 strictNullChecks;相比命名规范,这两个标志能捕获更多实际漏洞。
在边界处将 DTO 与映射器配对使用——不要仅仅因为两者都是“带类型的”,就将持久化结构泄露到 UI 组件中。