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&gt;3)。所以函数参数类型是Record&lt;string, string&gt;。下一步是定义返回类型,这由BoolRecord 完成,此类型采用原始 Record 并创建相同但具有您想要的 bool 字段。

我使用了Record实用程序类型,但这也可以通过mapped types实现(记录实际上是映射类型)。

有趣的部分是BoolRecord,它的定义说对于任何记录,给我记录具有相同的键(由keyof T 完成),布尔值类型。

【讨论】:

以上是关于Typescript从参数返回函数类型的主要内容,如果未能解决你的问题,请参考以下文章

在 TypeScript 中定义返回函数的函数类型时出现“找不到参数”

TypeScript:你能根据函数的参数定义一个返回类型结构吗?

基于可选函数参数的不同返回类型 - Typescript

typeScript函数篇

TypeScript:当提供变量 CLASS 作为函数参数时,将返回类型推断为该类的实例(仅来自参数)

如何使 TypeScript 从数组中推断参数的数量和类型