从数组参数动态构造类型和泛型

问题描述

试图编写将某些输入列表转换为其他类型但推断所有可能的值类型的函数。

这是我正在尝试的片段

type TypeD<N extends string = string,S = unknown> = {
    name: N;
    state: S;
};

function createD<N extends string = string,S = unknown>(
    name: N,state: S,): TypeD<N,S> {
    return { name,state };
}

type TypeR<N extends string = string,S = unknown> = {
    names: Set<N>;
    state: Record<N,S>;
};

function createR<
    D extends TypeD<N,S>,N extends string = D extends infer D
        ? D extends TypeD<infer N>
            ? N
            : never
        : never,S = D extends infer D ? (D extends TypeD<N,infer S> ? S : never) : never
>(...ds: D[]): TypeR<N,S> {
    const r = {
        state: {},names: new Set(ds.map((d) => d.name)),} as TypeR<N,S>;

    for (const d of ds) {
        r.state[d.name] = d.state;
    }
    return r;
}

const A = createD("A",0);
const B = createD("B",false);
// This does what I want successfully resulting in
// X = R<"A" | "B",number | boolean>
const X = createR(
    { name: "A",state: 0 },{ name: "B",state: false },);
// This leads to a compilation error on the B argument
const Y = createR(A,B);

问题是我如何才能在第二种情况(Y)中使createR函数的行为类似于第一种情况(X)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...