问题描述
试图编写将某些输入列表转换为其他类型但推断所有可能的值类型的函数。
这是我正在尝试的片段
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 (将#修改为@)