Typescript扩展通用接口

Typescript扩展通用接口,typescript,inheritance,typescript-generics,Typescript,Inheritance,Typescript Generics,我想创建一个接口,通过该接口我可以扩展任何类型的脚本类型,以添加一个属性来扩展泛型类型。例如,创建一个如下所示的Confidence类型: export interface Confidence<T> extends T{ confidenceLevel:number } function makeConfidence<T>(x: T, confidenceLevel: number): Confidence<T> { return Object.

我想创建一个接口,通过该接口我可以扩展任何类型的脚本类型,以添加一个属性来扩展泛型类型。例如,创建一个如下所示的
Confidence
类型:

export interface Confidence<T> extends T{
   confidenceLevel:number
}
function makeConfidence<T>(x: T, confidenceLevel: number): Confidence<T> {
  return Object.assign(x, { confidenceLevel });
}
导出接口信心扩展T{
信心等级:数字
}
然后可以通过以下方式访问:

const date:Confidence<Date> = new Date();
date.confidenceLevel = .9;
const-date:Confidence=new-date();
date.confidenceLevel=.9;
这似乎是不可能的(我感觉这是反模式的),但是我可以做到

export type Confidence<T> = T & {
   confidenceLevel:number
}
export type Confidence=T&{
信心等级:数字
}
这似乎完成了我想做的事情,尽管我觉得我这样做是在作弊


我认识到,如果覆盖泛型类型的属性,这个“反向扩展”可能会有问题,但这是唯一的问题吗?我很难理解这一点,创建仅添加属性的类型的最佳方法是什么?

您最后的代码片段是正确的方法

有一个长期的特性请求,它要求能够按照您要求的方式执行
接口Foo扩展T{…}
。它还没有实现(可能永远也不会实现)。现在,您只能创建一个接口,该接口使用静态已知键扩展对象类型。未指定的泛型类型参数
T
不起作用,因为编译器无法预测它将拥有哪些键

您应该放心,a是实现这一点的合理方式(注意,如果您添加的属性与
T
的属性冲突,您将不会收到警告)。这是上述特性请求中的解决方案。此外,还可以使用交点表示向现有对象添加特性的结果类型。因此,
置信度
定义如下

type Confidence<T> = T & {
  confidenceLevel: number
}
type Confidence=T&{
信心等级:数字
}
您可以很容易地编写一个函数,生成以下其中一个:

export interface Confidence<T> extends T{
   confidenceLevel:number
}
function makeConfidence<T>(x: T, confidenceLevel: number): Confidence<T> {
  return Object.assign(x, { confidenceLevel });
}
函数makeConfidence(x:T,confidenceLevel:number):Confidence{
返回Object.assign(x,{confidenceLevel});
}
并使用它:

const x = makeConfidence(new Date(), 0.9); // x is a Confidence<Date>;
console.log(x.getFullYear()); // 2020
console.log(x.confidenceLevel); 0.9
const x=makeConfidence(新日期(),0.9);//x是信心;
console.log(x.getFullYear());//2020
console.log(x.confidenceLevel);0.9
看起来不错。好吧,希望这会有帮助;祝你好运


您能详细说明一下吗?我想这有点像是一个骗局,但我很想听到更多的解释,关于这是否是反模式的,以及是否有更好的方法来实现我的目标。谢谢你的理智检查和关于它是一个要求的功能的注释!我想我对界面和类型有点困惑,但我想我会把它留到下一天。