当前位置: 首页 > 知识库问答 >
问题:

typescript - 如何根据传入的参数精确 `Promise` 返回的类型?

柯波
2024-06-19

演示: https://tsplay.dev/NB6axN

代码:

const action = {  '/posts': () => Promise.resolve(['a']),  '/test': () => Promise.resolve([1]),} as const;type test = ReturnType<ActionType['/test']>;async function getData<T extends ItemKey>(url: T) {  return await action[url]();}type ActionType = typeof action;type ItemKey = keyof typeof action;const post = getData('/posts');   // Promise<string[]>const test = getData('/test');   // Promise<number[]>

结果:

  • 传入 '/posts' 拿到 Promise<string[]>
  • 传入 '/test' 拿到 Promise<number[]>

前置条件:

  • 尽可能不要强行断言

共有3个答案

督嘉言
2024-06-19

尝试了一下

const action = {  '/posts': () => Promise.resolve(['a']),  '/test': () => Promise.resolve([1]),} as const;type test = ReturnType<ActionType['/test']>;type ActionType = typeof action;type ItemKey = keyof typeof action;type DePromise<T> = T extends Promise<infer R> ? R : T;type InferResult<T extends ItemKey> = DePromise<ReturnType<ActionType[T]>>;async function getData<T extends ItemKey>(url: T): Promise<InferResult<T>> {   return await action[url]() as InferResult<T>;}const post = getData('/posts');   // Promise<string[]>const test = getData('/test');   // Promise<number[]>

传送门:http://u5a.cn/qcTA9

尝试的时候遇到些问题:

  1. async 函数的返回类型必须是 Promise<?>,没办法,只好先 DePromise 之后再把 Promise 加上。
  2. await action[url]() 自动推导出来的类型是 number[] | string[],所以只好用 as InferResult<T> 强制声明类型。
白丁雨
2024-06-19

为方法本身提供返回值类型不就可以了吗。

const action = {  '/posts': (): Promise<string[]> => Promise.resolve(['a']),}const post = action['/posts']();
韦安怡
2024-06-19
function getData<T extends ItemKey>(url: T) {  return action[url]() as ReturnType<ActionType[T]>}
 类似资料:
  • 在TypeScript中,< code>class关键字引入了值和类型: 有没有一种方法可以使函数返回既是类型又是值的东西? 问这个问题的另一种方法是:有没有办法在下面声明的类型,以便类型检查? 看到这个打字游戏了吗

  • 问题内容: 我需要兑现承诺,以便可以通过封闭函数将其返回。我知道,由于正常的JavaScript范围,我可能无法按照编码的方式进行操作。有什么办法可以做到吗? 位于#1 的 console.log 会生成正确的数据。 console.log #2总是产生’a’; 任何指针将不胜感激。 问题答案: 许诺背后的基本原则之一是它是异步处理的。这意味着您无法创建承诺,然后立即在代码中同步使用其结果(例如,

  • typescript,函数如何根据传入的key,返回对象对应的这些key?比如: 现在这个写法肯定不对,变量attr的推断是unknown,如何写函数getAttr的返回定义,才能让变量attr的推断为{age:number, name:string },就是函数传入了哪些key,就只返回这些key的推断

  • TS演示:https://tsplay.dev/mLO04N , 问题:当我将reduce中返回对象的children注释去掉,返回的类型就变成any了,请问正确姿势应该是? 我把提取的值像这样复制给一个对象,获取的类型是对的,但是如果把这个对象作为返回数据类型就不对了 请不要试图类似用下面断言的方式来解决,我试图通过正确的姿势获取数据类型:

  • #1处的console.log生成正确的数据。console.log#2始终生成“a”; 如有任何指示,将不胜感激。

  • 如何使用TS根据传入的property得到对应的数据呢?比如JS中常常会根据动态的属性获取结果,如下: 在TS中,可以这样做: 我需要明确根据提供的property获取类型,该怎么做呢?

  • 为了理解TypeScript的精神,我在我的组件和服务中编写了全类型签名,这扩展到了angular2表单的自定义验证函数。 我知道我可以重载函数签名,但这需要每个返回类型的参数不同,因为将每个签名编译为单独的函数: 我还知道我可以返回单个类型(如Promise),它本身可以是多个子类型: 但是,在angular2自定义表单验证器的上下文中,单个签名(一个类型为的参数)可以返回两种不同的类型:带有表

  • 我在这里查过了https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md这是TypeScript语言规范,但我找不到如何声明函数的返回类型。 我在下面的代码中展示了我所期望的: 我知道我可以用