gpt4 book ai didi

typescript - 解决 TypeScript 类型中的 promise

转载 作者:行者123 更新时间:2023-12-05 08:20:24 26 4
gpt4 key购买 nike

这是 a question about resolving return types 的延续.我非常接近我想要做的事情(即具有基于验证数据构建模型实例的通用功能)并且它在 JS 中运行良好,但我无法理解输出 TS 类型的最后一部分。

关键是我的 Init 的返回类型 - 特别是 Builder<T[K]>部分。我明白为什么会导致 Builder<(id: number) => Promise<Test>>作为返回类型,但我终生无法弄清楚如何告诉 TS 实际上它只是 Test被返回,而不是返回 Test 的 Promise 的函数.

可以将以下内容复制/粘贴到 VSCode(或其他)中以显示问题。 ter1变量应该是 Test 的一个实例,当编译为 JS 时,它是,但 TS 看不到。

export interface Builder<T> {
(values: any, db: any): Promise<T>
}

export interface Wrapper {
<T, TId>(
construct: (id: TId, db: any | null) => Promise<T>,
idSrc: string | string[],
errorMsg: string
): Builder<T>
}

let builder: Wrapper = function (construct, idSrc, errorMsg ) {
// A function that can be used to construct the instance
return async function(values: any, db: any | null) {
let id = null;
let inst = await construct(id, db);

if (!inst) {
throw new Error(errorMsg);
}

return inst;
};
}


class Test {
is1 = true;

static async fromId( id: number ) {
var inst = new Test();
// Some async action (e.g. a db read)
return inst;
}
}
class Test2 {
is2 = true;

static async fromId( id: number ) {
var inst = new Test2();
// Some async action (e.g. a db read)
return inst;
}
}


type Config<T extends {}> = {
inputs?: {[index:string]: any},
inst?: T;
};

type Init = <T extends {[key:string]: any}>(
db: any,
config: Config<T>
) => Promise<{[K in keyof T]: Builder<T[K]>}>; // ???

let init: Init = async function ( db, config ) {
let ret: any = {};

if ( config.inst ) {
for (let [key, value] of Object.entries(config.inst)) {
let res = await value( {}, {} );
ret[ key ] = res;
}
}

return ret;
}


async function allan () {
let { ter1, ter2 } = await init( null, {
inst: {
ter1: Test.fromId,
ter2: Test2.fromId
}
} );

console.log( ter1.is1, ter1.is2 ); // should be `true undefined`

// Test `builder` typing
var t1Wrapper = builder( Test.fromId, 'id', 'test');
var t2Wrapper = builder( Test2.fromId, 'id', 'test');

var t1 = await t1Wrapper({}, {});
var t2 = await t2Wrapper({}, {});

t1.is1;
t2.is2;
}

allan();

谢谢!

最佳答案

看起来你想要的类型是这样的:

type Unpromise<T extends Promise<any>> = T extends Promise<infer U> ? U : never;

type Init = <T extends { [key: string]: (...args: any[]) => Promise<any> }>(
db: any,
config: Config<T>
) => Promise<{ [K in keyof T]: Unpromise<ReturnType<T[K]>> }>;

但我还没有花时间检查你所有的代码,看看它是否有意义,或者你是否正确地实现了它(这真的是一个 minimum example 吗?),所以如果你遇到一些问题,请原谅我其他问题。

解释:你调用的方式init()暗示T应该是一个对象,其属性是返回您关心的那种 promise 的函数。 (我不确定这些函数的参数类型和数量是否重要)。所以对于 T 中的每个属性你想提取它的返回类型,然后提取 promise 类型。

希望对您有所帮助。祝你好运!

关于typescript - 解决 TypeScript 类型中的 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53189169/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com