yunliuyan / type-challenges

typescript-challenges
0 stars 2 forks source link

00014-medium-promise-all #14

Open yunliuyan opened 11 months ago

yunliuyan commented 11 months ago

Promise.all 中等 #array #built-in

by Anthony Fu @antfu

接受挑战    English 日本語

由谷歌自动翻译,欢迎 PR 改进翻译质量。

键入函数PromiseAll,它接受PromiseLike对象数组,返回值应为Promise<T>,其中T是解析的结果数组。

const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise<string>((resolve, reject) => {
  setTimeout(resolve, 100, 'foo');
});

// expected to be `Promise<[number, 42, string]>`
const p = Promise.all([promise1, promise2, promise3] as const)

测试案例

import type { Equal, Expect } from '@type-challenges/utils'

const promiseAllTest1 = PromiseAll([1, 2, 3] as const)
const promiseAllTest2 = PromiseAll([1, 2, Promise.resolve(3)] as const)
const promiseAllTest3 = PromiseAll([1, 2, Promise.resolve(3)])

type cases = [
  Expect<Equal<typeof promiseAllTest1, Promise<[1, 2, 3]>>>,
  Expect<Equal<typeof promiseAllTest2, Promise<[1, 2, number]>>>,
  Expect<Equal<typeof promiseAllTest3, Promise<[number, number, number]>>>,
]

返回首页 分享你的解答 查看解答
Janice-Fan commented 11 months ago
declare function PromiseAll<T extends unknown[]>(values: readonly [...T]): Promise<{[p in keyof T]: T[p] extends Promise<infer R> ? R : T[p]}>

const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise<string>((resolve, reject) => {
  setTimeout(resolve, 100, 'foo');
});

// expected to be `Promise<[number, 42, string]>`
const p = Promise.all([promise1, promise2, promise3] as const)

const t = PromiseAll([promise1, promise2, promise3] as const)
yunliuyan commented 11 months ago

实现思路

将函数的参数,传入到Promise,若是元素是promise要取对应的具体基础类型

代码实现

const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise<string>((resolve, reject) => {
  setTimeout(resolve, 100, 'foo');
});

declare PromiseAll = <T extends any[]>(params:  [...T]) => Promise<{key in keyof T: T[key] extends Promise<infer R> ? R : T[key]}>

// expected to be `Promise<[number, 42, string]>`
const p = Promise.all([promise1, promise2, promise3] as const)
wudu8 commented 11 months ago
declare function PromiseAll<T extends unknown[]>(values: readonly [...T]): Promise<{[p in keyof T]: T[p] extends Promise<infer R> ? R : T[p]}>

const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise<string>((resolve, reject) => {
  setTimeout(resolve, 100, 'foo');
});

// expected to be `Promise<[number, 42, string]>`
const promiseTest = Promise.all([promise1, promise2, promise3] as const)

const promiseTest1 = PromiseAll([promise1, promise2, promise3] as const)
const promiseTest2 = PromiseAll([1, 2, Promise.resolve(3)])
Naparte commented 11 months ago

// 实现一个通用Last<T>,它接受一个数组T并返回其最后一个元素的类型。

// 键入函数PromiseAll,它接受PromiseLike对象数组,返回值应为Promise<T>,其中T是解析的结果数组。

declare function PromiseAll<T extends any[]>(values: readonly [...T]): Promise<{ [key in keyof T]: T[key] extends Promise<infer R> ? R : T[key] }>

const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise<string>((resolve, reject) => {
    setTimeout(resolve, 100, 'foo');
});

// expected to be `Promise<[number, 42, string]>`
const p = Promise.all([promise1, promise2, promise3] as const)

const promiseAllTest1 = PromiseAll([1, 2, 3] as const)
const promiseAllTest2 = PromiseAll([1, 2, Promise.resolve(3)] as const)
const promiseAllTest3 = PromiseAll([1, 2, Promise.resolve(3)])

type ttt = typeof Promise.resolve(3);