Typescript从参数返回函数类型
Posted
技术标签:
【中文标题】Typescript从参数返回函数类型【英文标题】:Typescript return type of function from parameter 【发布时间】:2020-04-27 05:42:54 【问题描述】:我想知道如何在 typescript 中执行以下操作:
如果我有这个功能:
function getQueries(query)
return Object.keys(query).reduce((list, key) =>
return ...list, [key]: query[key].length > 3
, )
我想在其中传递这样的对象
getQueries( first: 'dsds', second: 'dsdsds', third: 'ds' )
我想键入该函数以返回与我传递的完全相同的结构,但使用布尔值作为值。
const queries = getQueries( first: 'dsds', second: 'dsdsds', third: 'ds' )
queries.first // ts error -> Property 'first' does not exist on type ''
我该如何处理这种打字?
【问题讨论】:
【参考方案1】:您正在寻找泛型和映射类型:
function getQueries<T>(query: T): [key in keyof T]: boolean
【讨论】:
您能否给我一个带有正确答案的 jsfiddle/or_anything 链接,但它仍然对我显示错误。【参考方案2】:我的答案将更多地针对您的具体情况,我需要稍微重构当前代码以填充类型正确性。考虑闲置代码:
type BoolRecord<T extends Record<string, string>> = Record<keyof T, boolean>
function getQueries<Q extends Record<string, string>>(query: Q): BoolRecord<Q>
return Object.keys(query).reduce((list, key) =>
return ...list, [key]: query[key as keyof Q].length > 3
, as BoolRecord<Q>)
const result = getQueries( first: 'dsds', second: 'dsdsds', third: 'ds' );
// Record<"first" | "second" | "third", boolean>
我的假设是函数getQueries
需要作为带有字符串值的参数对象,因为您在内部使用length
属性(实现检查.length>3
)。所以函数参数类型是Record<string, string>
。下一步是定义返回类型,这由BoolRecord
完成,此类型采用原始 Record 并创建相同但具有您想要的 bool 字段。
我使用了Record实用程序类型,但这也可以通过mapped types实现(记录实际上是映射类型)。
有趣的部分是BoolRecord
,它的定义说对于任何记录,给我记录具有相同的键(由keyof T
完成),布尔值类型。
【讨论】:
以上是关于Typescript从参数返回函数类型的主要内容,如果未能解决你的问题,请参考以下文章
在 TypeScript 中定义返回函数的函数类型时出现“找不到参数”
TypeScript:你能根据函数的参数定义一个返回类型结构吗?