选择Typescript的原因:支持定义执行时的泛型参数

Posted TypeScript中文圈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了选择Typescript的原因:支持定义执行时的泛型参数相关的知识,希望对你有一定的参考价值。

在过去的一年里,我使用Flow构建了Saul,同时在工作项目中使用Typescript


问题起因

在函数调用时指定泛型参数(generic parameters)是我在使用Flow和Typescript的过程中面临的最大的问题,下面是一个例子:


在函数调用时,我非常注重改进我的泛型参数(generic parameters)——其他依赖泛型(generic)使用的开发人员也是如此。在实际开发中,处理高阶函数(higher-order functions)和复合函数(functional composition)时如果没有这个能力将会是一场灾难。


Typescript与Flow比较

简而言之,在每个使用函数中,如果我发送一堆泛型参数(generic arguments)到函数中,这个函数可以根据这些泛型参数给我一个回应,类型系统就可以给我一些缩小了泛型范围的选择。Typescript会这样做,但是Flow不会。


假设我有一个定义了一个高阶函数,如下:(这是一个高阶react组件,也是我项目中的一个实例)

选择Typescript的原因:支持定义执行时的泛型参数


简单的说,withAuthentication可以得到我传进去的所有属性,也就是OwnProps,并且分配一个user属性给它。


用Flow调用它:

选择Typescript的原因:支持定义执行时的泛型参数


Typescript调用


可以看出来,Typescript会记录我export出来的类型HOCType,当实际调用时AuthenticatedPage 会拥有IPageProps属性,包装组件IPageProps还会拥有 user属性。


而在Flow中,我必须明确的说明AuthenticatedPage的类型。


尽管这是一个更大的HOCs(高阶组件Higher-order components),但是当使用诸如lodashramdaimmutable等功能链接/组合的库时,它可以大大改进你的类型链条(types along the chain)。

注:文中的说法以写作这篇文章时的情况为准。Flow在未来可能会增加对这一差异的支持,不过当前因为这一问题,我已经开始把整个项目从Flow重构为Typescript了。


原文链接:https://codeburst.io/why-i-choose-typescript-specifying-generic-parameters-during-call-time-706003f55675


以上是关于选择Typescript的原因:支持定义执行时的泛型参数的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript中的泛型

使用类型安全定义 typescript 泛型

typescript 选择段时的回调

扩展类型的泛型和 Typescript 中的普通类型有啥区别?

typescript :具有原始类型约束的泛型类型

是否可以在 TypeScript 中传播独特的泛型类型?