我已经使用TypeScript几个月了,尽管我发现除了最基本的概念验证之外,任何项目都必须使用TypeScript,但是我确实发现自己在某种程度上被它拖慢了脚步。
自然地,定义接口的必要性将导致更多的代码,但是我认为可以改变很多方法以提高我们的敏捷性。
为了强调和阐明: I❤TypeScript-这不是讨厌的文章。 这些只是一些可能会提高TypeScript生产率的想法。
第三方库的类型可能不值得
一旦我们对自己的代码进行了智能感知,自动完成和错误检查,很自然地也希望我们使用的第三方库同样出色。
对于大多数库,某些库可能内置了类型信息,但是,我们需要使用外部DefinitelyTyped存储库。 如果不存在,我们可以创建自己的(甚至添加它供其他人使用)。
最初,这听起来让我非常兴奋。 我们将向所有库添加类型! JavaScript中的所有内容都会被严格键入!

在花了太多时间之后,我的建议是不要这样做:
复杂类型代码
由于JavaScript的动态特性,许多库都包含各种动态返回类型和参数。 TypeScript非常强大,您很可能能够表达这些类型,但是编写和阅读它们将具有挑战性。 例如,考虑从LoDash到flatMap函数的这些类型:
flatMap (this:LoDashImplicitWrapper <List <Many > |字典<Many > | NumericDictionary <Many > | null | undefined>):LoDashImplicitWrapper ;
由于这种复杂性,当您的代码中确实有类型错误时,错误消息将变得同样难以理解。
类型和库之间不匹配
库更改时,您的类型也需要更改。 由于外部类型和库之间没有直接链接,这可能意味着您正在使用的DefinintelyTyped类型是错误的。
需要说明的是:如果您使用的是本机支持TypeScript的库,那么您不必担心。 如果库没有,则不带类型使用它。
可疑优势
TypeScript的最大优点是允许我们在重构时验证类型并防止意外错误。 当处理复杂的数据结构时,它特别有用。
大多数javascript库都没有复杂的数据结构,并且由于我们不会重构库本身,所以我们真正获得的唯一好处是参数/返回值类型验证和自动完成。
自动完成虽然很有帮助,但实际上没有必要。 但是,类型验证很重要。 即使没有完整的库类型信息,我们也会看到一些方法。
如何使用非TypeScript库
因此,您如何使用第三方图书馆?
安装库后,要做的第一件事就是尝试像平常一样导入它。 如果有效,则表示它具有自己的类型定义,您可以照常进行。
但是,如果没有类型定义,TypeScript将不允许您使用import 。 在这种情况下,必须使用@ ts-ignore语法:
// @ ts-ignore
从 “ lodash” 导入 _;
现在,让我们使用例如我之前提到的flatMap函数。 这是我将其编写为尽可能保持类型安全的方式:
函数repeat(n:number){return [n,n]; }
const数据:number [] = [1,2];
const结果:number [] = _.flatMap(数据,重复);
注意我们如何将结果和数据设置为number []类型。 现在,即使我们没有键入要输入破折号的函数,该函数的实际用法也是完全类型安全的-如果您尝试假定结果是字符串,TypeScript将会抱怨。
我们保留了TypeScript的大多数优点,而几乎不用担心。
别成为一个狂热者-使用“ any”就可以了
您的所有代码都应在TypeScript中具有类型信息,尤其是数据模型。 但是,有时您要处理的对象不能具有简单类型。
这可能是您从自己的旧版JavaScript代码,动态数据库值或从库发送的参数中获得的。 当值或参数真正是动态的时,使用各种高级TypeScript构造创建超复杂的泛型类型可能不值得。 在这些情况下,使用“ any”是合法的选择。
一旦您处于模糊的动态区域之外,就应该立即使用适当的类型,并且应该特别避免使用数据模型。
请记住,就像100%的单元测试覆盖率是一个不现实的目标一样,关于TypeScript也可以这样说。 达到不可思议的100%类型信息不一定会使您的代码更安全,但很有可能使其变得更复杂且更不可读。
使用TypeScript进行原型制作较慢
像JavaScript这样的动态语言,其强项之一就是能够快速制作原型,测试,破坏事物并找到正确的实现方法。
我们想在API上抛出一些随机JSON,查看返回的内容,相应地调整我们的代码,并进行各种数据转换。 对于某些事情,我们从StackOverflow复制代码片段以查看它们在没有代码的情况下的性能,对于其他代码,我们想使用一些新的npm库,看看它是否有帮助。
另一方面,TypeScript喜欢我们慢慢走。 它希望每个文字对象都有一个类型,每个函数都必须定义其参数。 您不能随心所欲地编写代码,而必须不断停止并提供TypeScript类型要求。 这样做特别令人沮丧,只是发现您的想法不起作用,您必须删除所有内容。
因此,在制作原型时,TypeScript可能不是一个好主意。 我们总是可以为原型制作一个新的虚拟项目,但有时我们想在当前的TypeScript项目中进行原型设计。 我实际上想做的是在制作原型时禁用TypeScript,然后在以后决定如何进行操作时将其启用。
对我有用的解决方案是在Webpack配置中禁用TypeScript的类型检查:
{
加载程序:require.resolve(“ ts-loader”),
选项:{
//这将禁用任何类型检查
transpileOnly:是的,
}
},
如果您使用的是ForkTsCheckerWebpackPlugin,则还需要将其注释掉。 禁用这些项目后,TypeScript将像往常一样编译您的文件,但不会在类型问题上产生任何错误。
继续进行原型开发,不要分心,一旦完成原型制作,您对结果感到满意,重新启用TypeScript并解决所有问题。 每次需要在项目中进行原型设计时,请重复该过程。

TL; DR
总结一下我的观点:
- TypeScript非常强大,我强烈建议使用它。 它对您的应用程序数据模型特别有用。
- 在原型制作时禁用TypeScript,并在完成后重新启用。
- 不要花太多时间试图将类型信息获取到第三方库。
- 对于由于您无法控制的原因而过度抽搐的类型,可以使用any 。
- 与一般代码一样,争取可读性。