前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在 Typescript 中推断函数返回类型

在 Typescript 中推断函数返回类型

原创
作者头像
zayyo
发布2023-11-29 21:48:53
1220
发布2023-11-29 21:48:53
举报
文章被收录于专栏:zayyo前端

情景

你正在使用名为 funky-lib 的库中的 doFunkyStuff 函数。doFunkyStuff 返回一个名为 FunkyStuff 的接口,但是 funky-lib 并没有导出 FunkyStuff

库中的代码

代码语言:typescript
复制
// node_modules/funcky-lib/index.ts

interface FunkyStuff {
    message: string,
    funkinessLevel: number
}

export function doFunkyStuff(): FunkyStuff {
   console.log('doing funky stuff')

   return { 
      message: 'did some funky stuff',
      funkinessLevel: Math.random(),
   }
}

我们的代码

代码语言:typescript
复制
// index.ts
import { doFunkyStuff } from 'funky-stuff'

// eslint 提示 no-explicit-any
function repeatFunkyStuff(fStuff: any) {
  console.log('repeating funky stuff', fStuff)

  return {...fStuff}
}

repeatFunkyStuff(doFunkyStuff)

根据你的 eslint-config,eslint 可能会提示 "no-implicit-any" 或 "no-explicit-any"。

不好的解决方案

重新定义 FunkyStuff

代码语言:typescript
复制
function repeatFunkyStuff(fStuff: { message: string; funkinessLevel: number})

上述解决方案不好,因为如果 FunkyStuff 有很多属性,那么代码会变得难以阅读。

而且,每当 FunkyStuff 发生变化时,我们就必须更新我们的代码。

好的解决方案

使用 ReturnType 实用程序类型。

代码语言:typescript
复制
// index.ts 中的我们的代码
...
type AppFunkyStuff = ReturnType<typeof doFunkyStuff>

function repeatFunkyStuff(fStuff: AppFunkyStuff) {
   ...
}
...

额外信息

你可以将 ReturnType<T> 与 Awaited<T> 实用程序类型结合使用,用于返回承诺的函数。

假设 doFunkyStuff 返回一个 Promise,则 AppFunkyStuff 可以这样定义。

代码语言:typescript
复制
type AppFunkyStuff = Awaited<ReturnType<typeof doFunkyStuff>>

⚠️ Awaited 实用程序仅在 typescript 4.5 中才可用。在之前的版本中,实现相同效果可能有些棘手。

总结

这个提示只是 TypeScript 提供的众多功能中的冰山一角。

It seems you'd like the provided content translated. Here is the translation:


情景

你正在使用名为 funky-lib 的库中的 doFunkyStuff 函数。doFunkyStuff 返回一个名为 FunkyStuff 的接口,但是 funky-lib 并没有导出 FunkyStuff

库中的代码

代码语言:typescript
复制
// node_modules/funcky-lib/index.ts

interface FunkyStuff {
    message: string,
    funkinessLevel: number
}

export function doFunkyStuff(): FunkyStuff {
   console.log('doing funky stuff')

   return { 
      message: 'did some funky stuff',
      funkinessLevel: Math.random(),
   }
}

我们的代码

代码语言:typescript
复制
// index.ts
import { doFunkyStuff } from 'funky-stuff'

// eslint 提示 no-explicit-any
function repeatFunkyStuff(fStuff: any) {
  console.log('repeating funky stuff', fStuff)

  return {...fStuff}
}

repeatFunkyStuff(doFunkyStuff)

根据你的 eslint-config,eslint 可能会提示 "no-implicit-any" 或 "no-explicit-any"。

不好的解决方案

重新定义 FunkyStuff

代码语言:typescript
复制
function repeatFunkyStuff(fStuff: { message: string; funkinessLevel: number})

上述解决方案不好,因为如果 FunkyStuff 有很多属性,那么代码会变得难以阅读。

而且,每当 FunkyStuff 发生变化时,我们就必须更新我们的代码。

好的解决方案

使用 ReturnType 实用程序类型。

代码语言:typescript
复制
// index.ts 中的我们的代码
...
type AppFunkyStuff = ReturnType<typeof doFunkyStuff>

function repeatFunkyStuff(fStuff: AppFunkyStuff) {
   ...
}
...

额外信息

你可以将 ReturnType<T> 与 Awaited<T> 实用程序类型结合使用,用于返回承诺的函数。

假设 doFunkyStuff 返回一个 Promise,则 AppFunkyStuff 可以这样定义。

代码语言:typescript
复制
type AppFunkyStuff = Awaited<ReturnType<typeof doFunkyStuff>>

⚠️ Awaited 实用程序仅在 typescript 4.5 中才可用。在之前的版本中,实现相同效果可能有些棘手。

总结

这个提示只是 TypeScript 提供的众多功能中的冰山一角。

It seems you'd like the provided content translated. Here is the translation:


情景

你正在使用名为 funky-lib 的库中的 doFunkyStuff 函数。doFunkyStuff 返回一个名为 FunkyStuff 的接口,但是 funky-lib 并没有导出 FunkyStuff

库中的代码

代码语言:typescript
复制
// node_modules/funcky-lib/index.ts

interface FunkyStuff {
    message: string,
    funkinessLevel: number
}

export function doFunkyStuff(): FunkyStuff {
   console.log('doing funky stuff')

   return { 
      message: 'did some funky stuff',
      funkinessLevel: Math.random(),
   }
}

我们的代码

代码语言:typescript
复制
// index.ts
import { doFunkyStuff } from 'funky-stuff'

// eslint 提示 no-explicit-any
function repeatFunkyStuff(fStuff: any) {
  console.log('repeating funky stuff', fStuff)

  return {...fStuff}
}

repeatFunkyStuff(doFunkyStuff)

根据你的 eslint-config,eslint 可能会提示 "no-implicit-any" 或 "no-explicit-any"。

不好的解决方案

重新定义 FunkyStuff

代码语言:typescript
复制
function repeatFunkyStuff(fStuff: { message: string; funkinessLevel: number})

上述解决方案不好,因为如果 FunkyStuff 有很多属性,那么代码会变得难以阅读。

而且,每当 FunkyStuff 发生变化时,我们就必须更新我们的代码。

好的解决方案

使用 ReturnType 实用程序类型。

代码语言:typescript
复制
// index.ts 中的我们的代码
...
type AppFunkyStuff = ReturnType<typeof doFunkyStuff>

function repeatFunkyStuff(fStuff: AppFunkyStuff) {
   ...
}
...

额外信息

你可以将 ReturnType<T> 与 Awaited<T> 实用程序类型结合使用,用于返回承诺的函数。

假设 doFunkyStuff 返回一个 Promise,则 AppFunkyStuff 可以这样定义。

代码语言:typescript
复制
type AppFunkyStuff = Awaited<ReturnType<typeof doFunkyStuff>>

⚠️ Awaited 实用程序仅在 typescript 4.5 中才可用。在之前的版本中,实现相同效果可能有些棘手。

总结

这个提示只是 TypeScript 提供的众多功能中的冰山一角。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档