手写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 错误内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

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

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

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

    目录 前言 1.没有使用严格模式 我们为什么要使用严格模式? 2. 使用 || 确定默认值 那它应该是什么样子的呢? 3.使用any作为类型 为什么要这么做呢? 为什么不能用any? 4. val 作为 SomeType 强制告诉编译器它无法推断的类型. 这就是类型守卫的用途. 5. any在测试用例中的表现 在编写测试时 6. 可选属性 将属性定义为有时存在,有时不存在的可选属性. 清楚地表达,模型哪些组合存在,哪些不存在. 7. 使用一个字母作为泛型参数 用一个字母给作为名称,比如常用的T作

  • Java开发人员最常犯的10个错误

    这个列表总结了10个Java开发人员最常犯的错误. Array转ArrayList 当需要把Array转成ArrayList的时候,开发人员经常这样做: List<String> list = Arrays.asList(arr); Arrays.asList()会返回一个ArrayList,但是要特别注意,这个ArrayList是Arrays类的静态内部类,并不是java.util.ArrayList类.java.util.Arrays.ArrayList类实现了set(), get(),c

  • Python程序员开发中常犯的10个错误

    Python是一门简单易学的编程语言,语法简洁而清晰,并且拥有丰富和强大的类库.与其它大多数程序设计语言使用大括号不一样 ,它使用缩进来定义语句块. 在平时的工作中,Python开发者很容易犯一些小错误,这些错误都很容易避免,本文总结了Python开发者最常犯的10个错误,一起来看下,不知你中枪了没有. 1.滥用表达式作为函数参数默认值 Python允许开发者指定一个默认值给函数参数,虽然这是该语言的一个特征,但当参数可变时,很容易导致混乱,例如,下面这段函数定义: 复制代码 代码如下: >>

  • 关于mysql调用新手们常犯的11个错误总结

    前言 大家可能经常收到安全部门的警告邮件,SQL注入,XSS攻击漏洞等等,偶尔还被黑客挂了小马,郁闷不?还有数据库执行太慢(根据经验基本是没有正确使用索引导致) ,下面就跟着小编来一起看看MYSQL新手们常犯的11个错误吧. 1.使用MyISAM而不是InnoDB MySQL有很多的数据库引擎,单一般也就用MyISAM和InnoDB. MyISAM是默认使用的.但是除非你是建立一个非常简单的数据库或者只是实验性的,那么到大多数时候这个选择是错误的.MyISAM不支持外键的 约束,这是保证数据完整

  • Java程序员常犯的五个错误

    下面针对每一个错误用文字说明结合代码详解的方式展示给大家,具体内容如下: 1. Null 的过度使用 避免过度使用 null 值是一个最佳实践.例如,更好的做法是让方法返回空的 array 或者 collection 而不是 null 值,因为这样可以防止程序抛出 NullPointerException.下面代码片段会从另一个方法获得一个集合: List<String> accountIds = person.getAccountIds(); for (String accountId :

  • ASP初学者常犯的几个错误(ZT)

    1.记录集关闭之前再次打开:------------------------------------sql="select * from test"rs.open sql,conn,1,1if not rs.eof thendim myNamemyName=rs("name")end ifsql="select * from myBook"rs.open sql,conn,1,1----------------------------------

  • pandas初学者容易犯的六个错误总结

    目录 使用pandas自带的函数读取大文件 没有矢量化 数据类型,dtypes! 不设置样式 使用 CSV格式保存文件 不看文档! 总结 我们在这里讨论6个新手容易犯的错误,这些错误与你所使用工具的API或语法无关,而是与你的知识和经验水平直接相关.在实际中如果出现了这些问题可能不会有任何的错误提示,但是在应用中却会给我们带来很大的麻烦. 使用pandas自带的函数读取大文件 第一个错误与实际使用Pandas完成某些任务有关.具体来说我们在实际处理表格的数据集都非常庞大.使用pandas的rea

  • TypeScript手写一个简单的eslint插件实例

    目录 引言 前置知识 第一个eslint规则:no-console 本地测试 本地查看效果 no-console规则添加功能:排除用户指定的文件 发布npm包 引言 看到参考链接1以后,觉得用TS写一个eslint插件应该很简单⌨️,尝试下来确实如此. 前置知识 本文假设 你对AST遍历有所了解. 你写过单测用例. 第一个eslint规则:no-console 为了简单,我们只使用tsc进行构建.首先package.json需要设置入口"main": "dist/index.

  • PHP程序员最常犯的11个MySQL错误小结

    对于很多新手们来说,使用PHP可以在短短几个小时之内轻松地写出具有特定功能的代码.但是,构建一个稳定可靠的数据库却需要花上一些时日和相关技能.下面列举了我曾经犯过的最严重的11个MySQL相关的错误(有些同样也反映在其他语言/数据库的使用上)... 1.使用MyISAM而不是InnoDB MySQL有很多数据库引擎,但是你最可能碰到的就是MyISAM和InnoDB. MySQL默认使用的是MyISAM.但是,很多情况下这都是一个很糟糕的选择,除非你在创建一个非常简单抑或实验性的数据库.外键约束或

  • C#新手常犯的错误汇总

    本文所述为C#新手常犯的错误,但是实际上很多有经验的程序员也经常犯这些错误,对此特别整理了一下,供大家参考.具体如下: 1.遍历List的错误,比如如下代码: List<String> strList =newList<String> for(int i =0; i<strList.Count; i++) { strList.RemoveAt(i); } 这段代码看上去是删除了所有元素,实际上每次调用RemoveAt方法会导致List元素索引重排,最后导致元素没有完全删除.

随机推荐