关键词:
【中文标题】TypeScript 中具有泛型类型参数的泛型类型的替代方案【英文标题】:Alternatives for a generic type with generic type parameters in TypeScript 【发布时间】:2021-06-11 10:28:23 【问题描述】:假设我有两种类型的泛型函数,它们的返回类型不同。一个有返回类型T
,另一个有T[]
:
type F1 = <T>(t: T) => T
type F2 = <T>(t: T) => T[]
我想知道如何将这两种类型合并为一种通用类型。我想这样做的方式是让新的泛型类型接受另一个泛型类型作为参数(如 C++ 的template template parameters):
// Caution, Fantasy-TypeScript ahead!
// Accepts generic type R as parameter
// to transform return type of generic function
type F<R> = <T>(t: T) => R<T>
// define F1 and F2 in terms of F
type Id<T> = T
type F1 = F<Id>
type F2 = F<Array>
但是,泛型泛型参数尚不受支持(2021 年 3 月)。请参阅TypeScript Issue 和related SO question 了解更多信息。
TypeScript 中的替代方案是什么?
【问题讨论】:
【参考方案1】:一个简单的方法是使用Conditional Types:
type F<R> = <T>(t: T) => R extends void[] ? T[] : T
type F1 = F<void> // <T>(t: T) => T
type F2 = F<void[]> // <T>(t: T) => T[]
使用Indexed Access Types可以实现更灵活的实现:
type R<T> = Id: T, Array: T[]
type F<K extends keyof R<any>> = <T>(t: T) => R<T>[K]
type F1 = F<'Id'> // <T>(t: T) => T
type F2 = F<'Array'> // <T>(t: T) => T[]
请参阅my answer to a similar question,了解更多有关此技术的示例。
【讨论】:
typescript :具有原始类型约束的泛型类型
】typescript:具有原始类型约束的泛型类型【英文标题】:typescript:generictypewithprimitivetypesconstrain【发布时间】:2018-03-0508:33:32【问题描述】:我在打字稿中有以下通用类typeUserId=numbertypePrimitive=string|number|booleanclassColumnValue<T,Sexte... 查看详情
TypeScript 中每个键的泛型映射对象类型
】TypeScript中每个键的泛型映射对象类型【英文标题】:MappedobjecttypewithgenericperkeyinTypeScript【发布时间】:2021-03-2807:36:17【问题描述】:假设我有一个类型,它是由两项组成的任意数组:参数列表和参数与参数匹配的函数。为了... 查看详情
Typescript - 确保泛型属性存在于具有描述性错误的泛型类型上
】Typescript-确保泛型属性存在于具有描述性错误的泛型类型上【英文标题】:Typescript-EnsureGenericPropertyExistsOnGenericTypeWithDescriptiveError【发布时间】:2019-05-2913:12:43【问题描述】:(打字稿新手警告)我正在创建一个可重用的reducer... 查看详情
Typescript 推断的泛型类型在条件类型中是未知的
】Typescript推断的泛型类型在条件类型中是未知的【英文标题】:Typescriptinferredgenerictypeisunknowninconditionaltype【发布时间】:2020-09-2215:01:46【问题描述】:我无法理解为什么data属性在createRoute的参数中没有正确推断为FeatureFlagData。... 查看详情
在 Typescript 的泛型类中初始化泛型类型
】在Typescript的泛型类中初始化泛型类型【英文标题】:InitializinggenerictypeinsidegenericclassinTypescript【发布时间】:2019-10-0622:00:04【问题描述】:我想使用泛型类型在泛型类中初始化一个泛型类变量,但我不知道是否有办法做到这一... 查看详情
如何在流中定义具有指定类型的所有可选字段的泛型类型
...间】:2018-07-0718:18:30【问题描述】:我们可以很容易地在typescript中定义一个泛型类型,它可以让所有字段对于传递的泛型类型都是可选的。这种类型的查询在类型定义中非常有用,可以定义mongo查询的结 查看详情
在指定其他类型时,如何让 TypeScript 推断受约束的泛型类型的值?
】在指定其他类型时,如何让TypeScript推断受约束的泛型类型的值?【英文标题】:HowcanIhaveTypeScriptinferthevalueforaconstrainedgenerictypewhenspecifyingadditionaltypes?【发布时间】:2020-10-1021:19:55【问题描述】:在TypeScript中,我有一个接受带... 查看详情
具有逆变类型参数和 Unity 容器的泛型
】具有逆变类型参数和Unity容器的泛型【英文标题】:GenericswithcontravarianttypeparametersandUnitycontainer【发布时间】:2013-05-1907:06:50【问题描述】:我有一个带逆变类型参数的接口,比如IFoo:interfaceIFoo<inT>现在我有三个班级:classB... 查看详情
System.Enum 作为具有约束的泛型类型参数[重复]
】System.Enum作为具有约束的泛型类型参数[重复]【英文标题】:System.Enumasagenerictypeparameterwithconstraints[duplicate]【发布时间】:2012-09-2405:40:08【问题描述】:可能重复:CreateGenericmethodconstrainingTtoanEnumEnumtypeconstraintsinC#考虑以下类:pu... 查看详情
在 TypeScript 中,如何在具有多个类型参数的方法中推断出泛型类型参数?
】在TypeScript中,如何在具有多个类型参数的方法中推断出泛型类型参数?【英文标题】:InTypeScript,howcanigetagenerictypeparametertobeinferredinamethodthathasmultipletypeparameters?【发布时间】:2020-03-0920:05:48【问题描述】:我试图在下面的示例... 查看详情
GetMethod 的 Type[] 以获取具有两个参数和一个类型参数的泛型方法
】GetMethod的Type[]以获取具有两个参数和一个类型参数的泛型方法【英文标题】:Type[]forGetMethodtogetgenericmethodwithtwoargumentsandonetypeparameter【发布时间】:2021-12-1822:54:39【问题描述】:存在许多如何接收泛型方法的变体:通过LINQ等在... 查看详情
TypeScript 中的泛型类型继承
】TypeScript中的泛型类型继承【英文标题】:GenericTypeInheritanceinTypeScript【发布时间】:2020-01-0506:53:17【问题描述】:我对Typescript还是很陌生。请帮我解释一下下面的代码sn-p有什么问题。interfaceICalcValuereadonlyIsNumber:boolean;readonly:IsS... 查看详情
扩展类型的泛型和 Typescript 中的普通类型有啥区别?
】扩展类型的泛型和Typescript中的普通类型有啥区别?【英文标题】:WhatisthedifferencebetweenagenericthatextendsatypeandanormaltypeinTypescript?扩展类型的泛型和Typescript中的普通类型有什么区别?【发布时间】:2020-05-2317:32:00【问题描述】:Ty... 查看详情
在具有泛型参数的泛型方法中使用 Spring RestTemplate
】在具有泛型参数的泛型方法中使用SpringRestTemplate【英文标题】:UsingSpringRestTemplateingenericmethodwithgenericparameter【发布时间】:2014-03-2602:06:52【问题描述】:要在SpringRestTemplate中使用泛型类型,我们需要使用ParameterizedTypeReference(Un... 查看详情
建造者模式-具有递归类型参数的泛型类型(effective-java)
Effective-Java-Chapter2:来看看书中的Pizza代码案例(我写了详细注释):Pizza:importjava.util.EnumSet;importjava.util.Objects;importjava.util.Set;publicabstractclassPizzapublicenumToppingHAM,MUSHROOM,ONION,PEPPER,SAUSAGEfin 查看详情
使用正确的泛型类型迭代对象
...】:我想迭代一个通用接口。并使用jsx中对象的值。但是Typescript会抛出以下内容:\'(key:K)=>JSX.Element\'类型的参数不可分配给\'(value:string,index:number,array:string[])=> 查看详情
使用类型安全定义 typescript 泛型
】使用类型安全定义typescript泛型【英文标题】:Definingtypescriptgenericswithtypesafety【发布时间】:2013-07-1513:37:06【问题描述】:您可以像使用c#一样定义具有安全类型的泛型吗?例如publicboolFoo<T>()whereT:struct/**/Typescript现在有泛... 查看详情
java中的泛型理解(代码片段)
泛型,又名"参数化类型",顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。泛型的本质是为... 查看详情