手写TypeScript 时很多人常犯的几个错误

目录
  • 前言
  • 1.没有使用严格模式
    • 我们为什么要使用严格模式?
  • 2. 使用 || 确定默认值
    • 那它应该是什么样子的呢?
  • 3.使用any作为类型
    • 为什么要这么做呢?
    • 为什么不能用any?
  • 4. val 作为 SomeType
    • 强制告诉编译器它无法推断的类型。
    • 这就是类型守卫的用途。
  • 5. any在测试用例中的表现
    • 在编写测试时
  • 6. 可选属性
    • 将属性定义为有时存在,有时不存在的可选属性。
    • 清楚地表达,模型哪些组合存在,哪些不存在。
  • 7. 使用一个字母作为泛型参数
    • 用一个字母给作为名称,比如常用的T作为泛型名称!
    • 应该给出一个完整的描述性类型名称。
  • 8.非布尔检查
    • 通过将值直接传递给 if 语句来检查值是否已定义。
    • 我们可以明确检查我们关心的情况。
  • 9. !!操作符
    • 将非布尔值转换为布尔值。
    • 明确检查我们关心的状况。

前言

TypeScript 和 JavaScript 在过去几年中不断进步,我们在过去点时间中建立的一些实践可能已经过时。有些可能永远没有意义,下面我列出了很多=开发者可能会犯的几个错误!

1.没有使用严格模式

通过使用没有严格模式的 tsconfig.json。

使用严格模式后。

我们为什么要使用严格模式?

严格模式可以消除语法里一些不合理,不严谨的地方,可以让TS往更合理、更安全、更严谨的方向去发展: 通过将一些TS的静默错误更改为抛出错误,消除了TS的一些静默错误,能更加有效保障代码运行的安全; 提高编译器效率,增加运行速度; 禁止一些可能在ECMAScript未来版本中定义的语法。

2. 使用 || 确定默认值

那它应该是什么样子的呢?

使用最新的??运算符或者最好是在参数级别定义返回值。

??运算符去年才被引入,如果在长函数的中间使用值,可能很难将它们定义为参数默认值。

?? 与 || 不同,它只返回 null 或 undefined,而不是所有 falsy 值。

3.使用any作为类型

当我们不确定数据类型的时候,会使用any类型的数据。

在所有我们不确定类型的情况下,我们都应该使用unknown。

为什么要这么做呢?

any 很简单,因为它从根本上禁用了所有类型检查。通常,即使在官方类型中也使用 any(例如,上面示例中的 response.json() 被 TypeScript 团队键入为 Promise<any>)。

为什么不能用any?

它从根本上禁用所有类型检查。通过 any 进入的所有值都将完全放弃任何类型检查。这可能会变得非常难以捕捉错误,因为只有当我们对类型结构的假设符合运行时代码时,代码才会失败。

4. val 作为 SomeType

强制告诉编译器它无法推断的类型。

这就是类型守卫的用途。

当我们想要从 JavaScript 转换为 TypeScript 时,现有的代码库经常对 TypeScript 编译器无法自动得出的类型做出假设。在这些情况下,使用快速 as SomeOtherType 可以加快转换速度,而无需放松 tsconfig 中的设置。

即使现在可以保存断言,但当有人移动代码时,这可能会改变。类型保护将确保所有检查都是明确的。

5. any在测试用例中的表现

在编写测试时

如果需要为测试模拟数据,需要将模拟逻辑移动到我们模拟的旁边并使其可重用。

虽然在尚未有很好的测试覆盖率的代码库中编写测试时,经常会出现复杂的大数据结构,但测试中的特定功能只需要其中的一部分。短期内无需担心其他属性更简单。

最近一次是当其中一个属性发生变化时,我们必须在所有测试中更改它而不是一个中心位置。此外,在某些情况下,被测代码依赖于我们之前认为不重要的属性,然后必须更新该功能的所有测试。

6. 可选属性

将属性定义为有时存在,有时不存在的可选属性。

清楚地表达,模型哪些组合存在,哪些不存在。

将属性定义为可选而不是划分类型更容易并且生成的代码更少。它还需要对正在开发的产品有充分的了解,并且可以在对产品的假设发生变化时限制代码的使用。

类型系统的最大好处是它们可以用编译时检查代替运行时检查。通过更多的快速输入,可以在编译时检查可能被忽视的错误。

7. 使用一个字母作为泛型参数

用一个字母给作为名称,比如常用的T作为泛型名称!

应该给出一个完整的描述性类型名称。

我猜很多人有这种坏习惯,因为即使是官方文档也使用一个字母的名称。按 T 代替写全名可以更快地键入,并且不需要考虑太多。

泛型类型是变量,就像其他变量一样。当 IDE 开始向我们展示这些技术性时,我们已经放弃了在变量名称中描述变量技术性的想法。例如。我们通常只写 const name = ‘Daniel’ 而不是 const strName = ‘Daniel’。此外,一个字母的变量名通常会引起轰动,因为如果不看它们的声明,可能很难翻译它们的含义。

8.非布尔检查

通过将值直接传递给 if 语句来检查值是否已定义。

我们可以明确检查我们关心的情况。

用简短的方式编写检查看起来更简洁,并且可以让我们避免思考我们真正想要检查的内容。

也许我们应该考虑一下我们真正想要检查的内容。例如,上面给出的示例以不同的方式处理 countOfNewMessages 为 0 的情况。

9. !!操作符

将非布尔值转换为布尔值。

明确检查我们关心的状况。

对我们中的一些人来说,理解很简单。它看起来简短而简洁,如果您已经熟悉它,那么您就会知道它是关于什么的。这是将任何值转换为布尔值的简便方法。尤其是在代码库中,假值(如 nullundefined 和“”)之间没有明确的语义分离。

使用 !!通过宣传内部知识来混淆代码的真正含义。这使得新开发人员更不容易访问代码库,无论是一般开发的新手,还是 JavaScript 的新手。引入细微的错误也很容易。来自“非布尔布尔检查”的 countOfNewMessages 为 0 的问题仍然存在 !!

到此这篇关于手写TypeScript 时很多人常犯的几个错误的文章就介绍到这了,更多相关TypeScript 错误内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2022-09-11

那些项目中常见的TypeScript错误总结

目录 引言 1.TS2456 2.TS2554 3.TS1169 4.TS2345 5.TS2589 6.TS2322 总结 引言 TypeScript 错误信息由错误码和详细信息组成.例如:TS2456 ,其中错误码是以“TS”开头 + 数字(一般是 4 位数字)结尾这样的格式组成的字符串,用来作为特定类型错误的专属代号.下面我们看一下那些常⻅,但在官方文档甚少提及的类型错误: 1.TS2456 首先是由于类型别名循环引用了自身造成的 TS2456 类型错误,如下示例: type T = Re

.Net项目中一些常用验证操作

在项目中需要对用户输入的信息,以及一些方法生成的结果进行验证,一般在项目中较多的采用js插件或js来进行有关信息的校验,但是从项目安全性的角度进行考虑,可对系统进行js注入. 如果在后台对用户输入的信息进行验证会相对的安全,在出现信息验证不合法时,可以直接在程序中抛出异常,终止程序的运行. 现在提供几种较为常用的验证方法,可以减少在项目中开发时间和错误性: 1.判断域名: /// <summary> /// 普通的域名 /// </summary> /// <param na

基于C++中常见编译错误的总结详解

在日常编码过程中会遇见各种编译错误,本文对常见的编译错误进行分析总结.(基本的编译错误在这里不列举,后续后持续更新) 1.error c101008a解决方法该错误出现在项目升级过程中会出现,比如说项目从vs2008升级到vs2010.解决办法:在项目上点右键,清理(Clean),重新编译,问题解决 2.error C2252解决方法该错误主要在项目从vs2008升级到vs2010出先.error C2252: an explicit instantiation of a template ca

详谈Linux开发中常见段错误问题的原因及分析

1    使用非法的内存地址(指针),包括使用未经初始化及已经释放的指针.不存在的地址.受系统保护的地址,只读的地址等,这一类也是最常见和最好解决的段错误问题,使用GDB print一下即可知道原因. 2    内存读/写越界.包括数组访问越界,或在使用一些写内存的函数时,长度指定不正确或者这些函数本身不能指定长度,典型的函数有strcpy(strncpy),sprintf(snprint)等等. 3    对于C++对象,应该通过相应类的接口来去内存进行操作,禁止通过其返回的指针对内存进行写操

浅析Android中常见三种弹框在项目中的应用

一丶概述 弹框在Android项目中经常出现,常见的实现方法有三种:Dialog 弹框,Window弹框,Activity伪弹框.本文就说一说三种弹框的实现及在项目中的运用. 二丶演示图         图一为常见的三种弹框(文末上链接),图二为项目中用到的Activity伪弹框 三丶正文 1.Dialog弹框 先看一篇一篇文章: android 8种对话框(Dialog)使用方法汇总 Dialog是系统自带的弹框,然而常常因为UI不好看而遭嫌弃,常需要自定义 public class MyDi

android项目从Eclipse迁移到Android studio中常见问题解决方法

(1)将Eclipse项目导入到Android studio 中出现9-patch image问题解决方法: 在build.gradle里添加以下两句: aaptOptions.cruncherEnabled = false aaptOptions.useNewCruncher = false 用来关闭Android Studio的PNG合法性检查的,直接不让它检查. (2)Android Studio 错误: 非法字符: '\ufeff' 解决方案|错误: 需要class, interface

在Vue项目中使用Typescript的实现

3.0迟迟没有发布release版本,现阶段在Vue项目中使用Typescript需要花不小的精力在工程的配置上面.主要的工作是webpack对TS,TSX的处理,以及2.x版本下面使用class的形式书写Vue 组件的一些限制和注意事项. Webpack 配置 配置webpack对TS,TSX的支持,以便于我们在Vue项目中使用Typescript和tsx. module.exports = { entry: './index.vue', output: { filename: 'bundle

python中常见错误及解决方法

python常见的错误有 1.NameError变量名错误 2.IndentationError代码缩进错误 3.AttributeError对象属性错误 详细讲解 1.NameError变量名错误 报错: >>> print a<br>Traceback (most recent call last):<br>File "<stdin>", line 1, in <module><br>NameError:

asp.net开发中常见公共捕获异常方式总结(附源码)

本文实例总结了asp.net开发中常见公共捕获异常方式.分享给大家供大家参考,具体如下: 前言:在实际开发过程中,对于一个应用系统来说,应该有自己的一套成熟的异常处理框架,这样当异常发生时,也能得到统一的处理风格,将异常信息优雅地反馈给开发人员和用户.我们都知道,.net的异常处理是按照"异常链"的方式从底层向高层逐层抛出,如果不能尽可能地早判断异常发生的边界并捕获异常,CLR会自动帮我们处理,但是这样系统的开销是非常大的,所以异常处理的一个重要原则是"早发现早抛出早处理&q

10 种最常见的 Javascript 错误(频率最高)

为了回馈我们的开发者社区,我们查看了数千个项目的数据库,发现了 JavaScript 中频度最高的 10 种错误.我们会告诉你什么原因导致了这些错误,以及如何防止这些错误发生.如果你能够避免落入这些 "陷阱",你将会成为一个更好的开发者. 数据才是王道,我们收集并分析了出现频次排前 10 的 JavaScript 错误. Rollbar 会收集每个项目的所有错误,并总结每个错误发生的次数.我们通过根据 "指纹"(rollbar 用到的一种算法,详见:https://

如何在原有Android项目中快速集成React Native详解

前言 RN经过一段时间发展,已经有充分数量的人尝试过了,就我身边就有几批,褒贬也不一: ① 做UI快 ② 还是有很多限制,不如原生Native ③ 入门简单,能让前端快速开发App ④ iOS&Android大部分代码通用 ⑤ code-push能做热更新,但是用不好依旧坑 ...... 在得到一些信息后,可以看出,要用RN高效率的做出比较不错的App是有可能的,单看投入度与最初设计是否合理,而且现在关于React Native的各种文档是相当丰富的,所以这个阶段想切入RN可能是一个不错的选择.