TypeScript:组合泛型类型的返回类型始终未知

TypeScript:组合泛型类型的返回类型始终未知,typescript,generics,design-patterns,Typescript,Generics,Design Patterns,我想创建一个设置存储。用户可以添加具有任何类型值的设置。然后他可以检索一个值并正确地键入它 我的想法是:这听起来像是连接的泛型类型参数。结果的类型取决于getSetting()方法的参数类型。因此,我尝试创建saidgetSetting()方法,使其接受一个类型作为输入,并根据该类型推断返回类型。这种方法使用类型作为键来获取正确的信息 以下是我目前的做法。它似乎有点接近我想要的,但是getSetting的返回类型总是unknown。在这个例子中,我希望它是number abstract clas

我想创建一个设置存储。用户可以添加具有任何类型值的设置。然后他可以检索一个值并正确地键入它

我的想法是:这听起来像是连接的泛型类型参数。结果的类型取决于
getSetting()
方法的参数类型。因此,我尝试创建said
getSetting()
方法,使其接受一个类型作为输入,并根据该类型推断返回类型。这种方法使用类型作为键来获取正确的信息

以下是我目前的做法。它似乎有点接近我想要的,但是
getSetting
的返回类型总是
unknown
。在这个例子中,我希望它是
number

abstract class Setting<T> {
  abstract value: T;
}
class SD extends Setting<number> {
  value = 0;
}

let getSetting = <T extends Setting<K>, K>(type: new () => T): K => {
  // return value somehow
};

let setting = getSetting(SD); // type of setting is unkown instead of number
抽象类设置{
抽象值:T;
}
类SD扩展设置{
数值=0;
}
让getSetting=(类型:new()=>T):K=>{
//返回值
};
let setting=getSetting(SD);//设置的类型是未知的,而不是数字

我的错误在哪里?或者有一种完全不同的方法来实现类似的功能吗?

类型推断是从参数而不是从其他类型参数进行的,因此您需要以某种方式在参数列表中移动
K

最简单的版本是删除
T
,您可以说构造函数返回
设置
,任何派生类都可以工作,而且由于您不在任何其他容量中使用
T
,这似乎是最简单的解决方案:

let getSetting = <K,>(type: new () => Setting<K>): K => {
  return new type().value
};

或者您可以完全取消
K
,并使用索引类型查询提取值的类型:


let getSetting = <T extends Setting<any>>(type: new () => T): T['value'] => {
  return new type().value
};



let getSetting=嘿,谢谢你的回答!选项2和3完全符合我的要求。只是一个关于选项2的问题:
new()=>T&Setting
是什么意思?符号在这里做什么?@SebastianGebert它是一种交叉类型,如果你有一个定义为
a&B
的类型,任何值都必须同时满足
a
B
才能成为
a&B
类型。在推理的情况下,这将导致匹配的任何值都成为交叉点中两种类型的推理源。在这种情况下,构造函数的返回类型将与
T
Settings
匹配,从而独立地推断
T
K

let getSetting = <T extends Setting<any>>(type: new () => T): T['value'] => {
  return new type().value
};