首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

TypeScript: 请停止使用 any

我们看到的大多数用法都表明我们正在处理 TypeScript 的基本类型。文档我们可能找到: (…)来不使用 TypeScript 或第3方库编写的代码的值。...有些参数很难正确输入,但是 any 更容易 如果我们没有正确地输入,我们将会编写错误,比我们动态语言中会编写更多的错误,因为我们强制 TypeScript ,一种静态类型语言,去检查不正确的类型。...但它将这个负担转移到我们代码的未来读者身上。他们将不得不在没有上下文和编译器帮助的情况下解释发生了什么。...我已经通过必要的运行时检查以防御性的方式编写了代码,以确保没有错误 现在可能没有错误,但是除非你有很好的测试覆盖率,否则以后来修改代码的人不会相信他们不是错误重构;就好像编译器不会帮你,因为我们说过它不会帮你...但是只有尝试其他所有方法之后才推荐使用。如果使用它,我们应该将其重新转换为可预测的类型。 如果我们的函数可以真正处理任何类型,那么这种情况很少见,并且是偶然的(例如调试或日志记录函数)。

1.1K21

TypeScript 官方手册翻译计划【一】:基础

如果我们只是添加了一点代码,保存文件,重新运行代码,然后马上看到报错,那么我们或许可以快速定位到问题 —— 但这种情况毕竟只是少数。我们可能没有全面、彻底地进行测试,以至于没有发现一些潜在错误!... TypeScript ,下面的代码抛出一个错误,指出 location 没有定义: const user = { name: 'Daniel', age: 26, }; user.location...这可能有点出乎意料,明明 tsc 刚才报错了啊,为什么还是可以编译产出文件呢?但这种结果其实和 TypeScript 的核心原则有关:大多数时候,开发者比 TypeScript 更了解代码。...在这种情况下,你可以开启 noEmitOnError 编译选项。...TypeScript 有几个和类型检查相关的严格性设置,它们可以随时打开或关闭,如若没有特殊说明,我们文档的例子都是开启所有严格性设置的情况下执行的。

88810
您找到你想要的搜索结果了吗?
是的
没有找到

前端老手 10 年心得,JavaScriptTypeScript 项目保养实用指南

如果代码是他们很久以前编写的,那情况就会更糟糕了。 我们能做些什么呢? 确保开发人员开发过程能够尽快看到警告和类型错误。这不应该花费额外的成本。如果可能的话,集成到他们的 IDE 。...但是,第三方错误不一定能够发生之时就探测到,因此最好是定期监控,而不是开发人员每次推送代码变更的时候进行监控。...更糟糕的是,由于技术债务、缺乏测试或意外复杂性的积累,某些组成部分的维护可能变得很复杂。 在这种情况下,要像上文所建议的那样,整个代码库对代码实现一致的内聚预期可能变得很复杂。...例如: 生产系统为什么崩溃?——因为一个未登录的用户访问了页面 B。 用户为什么能够访问页面 B?——因为主页上有一个链接。 用户访问页面 B 的时候为什么没有看到登录页面?...——因为页面渲染时,后端还不知道登录状态。 为什么页面渲染时还不知道登录状态?——因为我们的会话管理后台很慢,等待这个状态大大降低我们的网络性能指标。 为什么会话管理后端很慢?

13110

java异常正确打印姿势

流水线形式加异常日志开发业务逻辑的时候,完全不考虑异常,等全部开发完成,流水线的补充异常的处理机制。统一为所有方法打上 try…catch…捕获所有异常记录日志。...错误1:全部交由框架处理全部交给框架去处理,业务逻辑不处理。比较好的方式框架可以做兜底工作。异常上升到最上层逻辑还是无法处理的话,可以以统一的方式进行异常转换处理那些未知异常。...对于自定义的业务异常,提取异常错误码和消息等信息,转换为合适的 API 包装体返回给 API 调用方。注意规范定义简言赅的异常信息。...直接丢弃异常不记录、不抛出。这样的处理方式还不如不捕获异常,因为被生吞掉的异常一旦导致 Bug,就很难程序中找到蛛丝马迹。错误3:丢弃异常的原始信息自认为是自己知道的异常,只记录自己组装的异常信息。...; }}比较好的方式如上异常只知道文件读取错误的Message,至于为什么读取错误、是不是文件不存在,还是没权限,完全不知道。需要打印完整的异常信息。

15310

TypeScript 真的值得吗?

例如,如果表达式的静态类型为 string,则在运行时,要保证评估它时仅获得 string。 健全的类型系统,绝对不会在编译时或运行时产生表达式与预期类型不匹配的情况。...我仍然遇到许多运行时错误,tsc 编译器不会标记这些错误。通过这种方法,TypeScript 健全和不健全的阵营脚踏两只船。这种半途而废的现象是通过 any 类型强制执行的,我将在后面提到。...我能够理解为什么 TypesScript 走这条路,并且有一个论点指出,如果健全类型系统能够得到 100% 的保证,那么对 TypeScript 的使用率讲不会那么高。...TypeScript 不会对现有的做法有良好的提高。我仍然必须编写尽可能多的测试。你可能不同意,不过我一直在编写更多的代码,并且不得不去编写类型测试,同时仍然遇到意外的运行时错误。...TypeScript 提供了基本的类型检查,但健全性和运行时类型检查不是它的目标,这使 TypeScript 美好的世界和我们所处的现状采取折衷。

1.4K20

JavaScript 程序员可以从C ++中学到什么

实际上即使这种行为从根本上来讲是可预测的,但某些自动推测也不那么直观,并且很多大型项目的代码库,很容易看到类型强制转换导致了意外错误发生。...虽然类型强制转换可以帮助开发人员更快速、简洁地编写代码,但是它使初学者思考得更少,从而也就不清楚为什么这样的转换系统可能导致错误,特别是更大、更复杂的代码库。... C++ ,每声明一个变量时,我们也决定要保留多少内存。例如,普通的 char 通常只包含8位(1字节),这就将其用途限制为 ISO Latin 表的255个字符。...当这种情况发生时,日期将会变为负的 2,147,483,647,这个时间是 1901 年 12 月 13 日。... TypeScript 上有很多不错的资源,足以说明它是能确保你代码可扩展性而且没有错误的好方法,它可以帮助我们避免本文在前面关于“强制类型”那一节中看到的那种不直观的结果。

66920

以淘宝店铺为例,谈谈 TypeScript ESLint 规则集考量

为什么:类似于 array-type,做语法统一,但需要注意的是 Tsx 项目中使用 断言导致报错,因为不像泛型可以通过 来显式告知编译器这里是泛型语法而非组件...为什么:虽然 TypeScript 是允许使用各种合法表达式作为枚举成员的,但由于枚举的编译结果拥有自己的作用域,因此可能导致错误的赋值,如: const imOutside = 2; const b...:首先,记住我们是TypeScript,所以不要想着你的变量值还有可能是 null 所以需要这样判断,如果真的发生了,那么说明你的 TS 类型标注不对哦。...值导入与类型导入 TypeScript 中使用不同的堆空间来存放,因此无须担心循环依赖(所以你可以父组件导入子组件,子组件导入定义父组件的类型这样)。...推荐规则配置仅开启 allowNumber 来允许数字,而禁止掉其他的类型,你所需要做得应当是把这个变量填入模板字符串时进行一次具有实际逻辑的转化。

2.6K30

美团前端二面常考react面试题(附答案)

React.forwardRef 创建一个React组件,这个组件能够将其接受的 ref 属性转发到其组件树下的另一个组件。...这种技术并不常见,但在以下两种场景特别有用:转发 refs 到 DOM 组件高阶组件中转发 refs为什么虚拟 dom 提高性能虚拟 dom 相当于 js 和真实 dom 中间加了一个缓存,利用...vue 或者react 优化整体优化虚拟dom为什么虚拟 dom 提高性能?...但在大多数情况下,Hooks 就足够了,可以帮助减少树的嵌套。...Fiber ,reconciliation 阶段进行了任务分割,涉及到 暂停 和 重启,因此可能导致 reconciliation 的生命周期函数一次更新渲染循环中被 多次调用 的情况,产生一些意外错误新版的建议生命周期如下

1.2K10

使用TypeScript两年后,还值得吗?

如果你没有这种语言的背景,一开始可能有点奇怪。TypeScript中有许多功能在当前的JavaScript语法找不到。让我们谈谈其中对我来说最有用的那些。...这就是为什么有些情况下使用类而不是接口(如使用Angular Dependency Injection)更好。让我们看一下接口的一些真实例子: ? 左边 - 返回类型的错误实现。...右侧 - VS Code 立即通知你代码错误。 ? 左侧 - 一个类错误地实现了用户扩展的接口(参见上一个屏幕)。右边 - 描述错误信息.. 类 ES6有类,所以你可能之前用过它。...但是TypeScript类中有一些额外的功能,可能EcmaScript的未来实现这些功能。TS,您可以定义抽象类,你可以将类的属性描述为静态,私有或只读,您可以扩展类并使类实现接口(没毛病)。...(代码质量这个层面) 代码没有与参数或变量名的拼写错误相关的一些非常烦人的运行时错误 您可以建立清晰明了的对象之间的约定 不用hack的手段就能实现类似class中使用private的事情 有来自编译器的即时反馈

1.3K20

以和为贵!让 ESlint、Prettier 和 EditorConfig 互不冲突

网上关于这个话题的确有很多说法,但大部分都是针对某个特定项目给出一个配置,而非深入阐释为什么 ESLint、Prettier 或 EditorConfig 八字不合。...错误看起来和 @typescript-eslint 规则有关。 如果你像我一样使用 VSCode 并开启了保存时自动执行 ESLint 修复,可能会看到这种情况: ?...比如对于这个 @typescript-eslint 插件里面的缩进规则,他们往 rules 数组添加一条这样的规则: "@typescript-eslint/indent": ["error", 2...,这违背了我们的分工策略 按照之前的整合方法,通过 extends 数组增加 prettier/@typescript-eslint 来禁用相关插件中所有关乎 代码格式化 的规则。...上面例子的选项就应该只 .editorconfig 存在。 据此再检查我们上面做过的所有配置,还能发现一个配置错误。我们 Prettier 配置中指定了缩进距离。

8.9K70

TypeScript 的魔法技能:satisfies

例如,下面这行代码编译得很好,但会在运行时会抛出错误: routes.NONSENSE.path // TypeScript 报错:发现这个路由属性不存在 为什么这样?...routes.AUTH.children.LOGIN.path // ✅ routes.HOME.children.LOGIN.path // ❌ routes.HOME has no property `children` 与 as const 结合 当然,开发你还可能遇到的一种情况是...那么,这种情况下,我们可以通过组合 satisfies 和 as const 得到最好的结果: const routes = { HOME: { path: '/' } - } satisfies...对于 as const,创建对象时,我们不会对对象本身进行任何类型检查。因此,这意味着我们的 IDE 没有自动检查,也没有在编写时对错别字和其他问题的警告。 这就是为什么要进行组合的原因。...Typescript 4.9 引入了新的 satisfies 关键字,它对于 Typescript 中大多数与类型检查、匹配相关的任务都非常方便。

36410

我们用了一个周末,将 370 万行代码迁移到了 TypeScript

我们一直努力确定开发者们最关心的紧迫问题:例如,我们全部开发工具中都集成了上报错误 / 不便的功能,确保将情况快速发送给相关团队以评判优先级。...我们还向 codemod 添加二次检查,希望进一步减少生成代码错误,同时使用 TypeScript 的 @ts-expect-error 注释来标记这些错误。...可以看到,我们的基本思路并不是提前解决掉每个错误,而是尽快替换掉 Flow,并在过程当中跟踪实际发生TypeScript 错误抑制并加以解决。...在这种情况下,我们决定先禁用某些检查,并在转换完成后再行恢复。 通过手动上传 build,我们 Dashboard 与面向用户功能的产品团队成功会合。...整个过程给了我们很大信心,但这种颠覆性的变更还是让大家有点忐忑:虽然我们牢牢掌握着开发工具和构建过程,但毕竟代码库的每个文件都发生了变化。

73040

旧项目TypeScript改造问题与解决方案记

改造问题记录与分析 VSCode相关 “无法找到相关模块”报错 项目中,如果我们使用了webpack.alias,可能提示找不到模块。...JavaScript项目中的jsconfig.json同理。 TypeScript相关 对象属性赋值报错 JavaScript,我们经常会声明一个空对象,然后再给这个属性进行赋值。...但是这个操作放在TypeScript是会发生报错的: let a = {}; a.b = 1; // 终端编译报错:TS2339: Property 'b' does not exist on type...这是由于我们`tsconfig.json`中指定的`target`是ES5,而TypeScript并没有相关的polyfill,因此我们无法使用ES2015新增的方法。...针对这种需求,我们只需要在webpack编译的loader增加相关ts文件的配置,并且extension增加`.ts`后缀的支持。

4.9K10

TypeScript 4.2 正式发布:更智能的类型别名保留,声明缺失的帮助函数,还有许多破坏性更新

TypeScript playground 发生什么。...为什么这样?这与 TypeScript 如何在内部表示类型有关。当用一个或多个组合类型创建组合类型时,它总是将这些类型规范化为一个扁平的组合类型——但这样做丢失信息。...这就是为什么 TypeScript 引入了一个新的标志,--noPropertyAccessFromIndexSignature。在这种模式,你将选择使用 TypeScript 的旧行为来发出错误。...tsc --explainFiles 当使用此选项时,TypeScript 编译器将给出一些非常详细的输出,说明文件为什么会出现在程序。...的 API 来解析 JavaScript 文件的类型构造(尝试解析 Flow 文件时会发生),这可能会对你有所影响。

3.2K20

TypeScript 2.6 来了!

这就是为什么 TypeScript 双变地 或 双向地 比较参数。...但是 `makeLowerCase` 可能得到一个 `number` 这就是为什么 TypeScript 2.6 ,我们给用户提供了一个收紧的方法 strictfunctiontypes 。...使用 // @ts-ignore 隐藏文件的报错 历史上,我们已经避免了 TypeScript 隐藏报错,因为大多数情况下,用户想要可以通过更准确的申明文件或使用断言 any 解决。...例如,以下代码TypeScript 通常会报告 console.log 声明不可访问。 TypeScript 2.6 , // @ts-ignore 完全忽略注释。...在你确实需要使用这些注释的情况下,我们建议像上面的例子一样,留一个为什么注释是被需要的解释。 改进的工具支持 我们对 TypeScript 上的投入不仅涉及语言和编译器。

1.1K20

JavaScript 败北,TypeScript 大势所趋?

到现在 2019年,TypeScript GitHub 最常用编程语言排行榜排名第 7 位,增速最快的编程语言排行榜占第 5 位。...用 JavaScript 编写的合法代码, TypeScript 依然有效。 Typescript 是纯面向对象的编程语言,包含类和接口的概念。...为什么要用 TypeScript ? TS 开发时就能给出编译错误, 而 JS 错误则需要在运行时才能暴露。 作为强类型语言,你可以明确知道数据的类型。代码可读性极强,几乎每个人都能理解。...为什么不该用 TypeScript ? TS 需要编译。TS 得通过编译才能变成 JS 代码。 随着时间的推移,类型可能变得非常复杂。当项目不断变大时这种情况十分常见。...尽管 TS 是类型安全的,在有些情况下编译器也有检查不出任何错误情况。当我们修改编译后的 JS 代码时,错误就不可检测了。不过随着编译器不断改进,这种情况越来越少。 4.

1.5K10
领券