TypeScript 中具有泛型类型参数的泛型类型的替代方案

     2023-03-13     111

关键词:

【中文标题】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中的泛型理解(代码片段)

泛型,又名"参数化类型",顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。泛型的本质是为... 查看详情