Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 省略泛型类型为的类的属性_Typescript_Class_Typescript Generics - Fatal编程技术网

Typescript 省略泛型类型为的类的属性

Typescript 省略泛型类型为的类的属性,typescript,class,typescript-generics,Typescript,Class,Typescript Generics,我正在开发一个(编码/解码JSON类) 我正在尝试正确地进行类型检查,并在我的实体类上成功地实现了它,但在我的实体生成器类上无法正确地实现它 原因是Entity可用于类实例,而EntityBuilder可用于类 下面是一个代码示例(): A类{ x:数字; z:编号; } 导出类EntityBuilder{ /** *从源数据生成实体对象。 */ 公共静态buildOne(buildClass:T,sourceData:Omit):T{ 检查类有效性(buildClass); 常量实体:any=

我正在开发一个(编码/解码JSON类)

我正在尝试正确地进行类型检查,并在我的
实体
类上成功地实现了它,但在我的
实体生成器
类上无法正确地实现它

原因是
Entity
可用于类实例,而
EntityBuilder
可用于类

下面是一个代码示例():

A类{
x:数字;
z:编号;
}
导出类EntityBuilder{
/**
*从源数据生成实体对象。
*/
公共静态buildOne(buildClass:T,sourceData:Omit):T{
检查类有效性(buildClass);
常量实体:any=newbuildClass();
if(buildClass.constructor==Array.constructor)console.log(sourceData)
//我们确保“fromJson”可以像这样使用
//可以简单地用`@Type(Object)注释`
if(typeof entity.fromJson=='function'){
entity.fromJson(sourceData);
返回实体;
}否则{
以T//的形式返回sourceData,不必介意
}
}
/**
*从源数据数组生成多个实体。
*/
公共静态buildMany(buildClass:T,sourceData:Omit[]):T[]{
检查类有效性(buildClass);
返回sourceData.map(entityData=>this.buildOne(buildClass,entityData));
}
/**
*检查是否传递了有效的类。
*/
私有静态checkClassValidity(buildClass:any){
if(buildClass的类型!=“函数”){
抛出新错误('找不到类');
}
}
}
EntityBuilder.buildOne(A,{})
最后一行返回以下错误:

Argument of type '{}' is not assignable to parameter of type 'Pick<typeof A, "prototype">'.
  Property 'prototype' is missing in type '{}' but required in type 'Pick<typeof A, "prototype">'.
“{}”类型的
参数不能分配给“Pick”类型的参数。
类型“{}”中缺少属性“prototype”,但类型“Pick”中需要属性“prototype”。
虽然我希望它告诉我第二个参数缺少
x
z
属性

我省略了json中的
toJson
,因为这些是我的方法,应该用作
类a
的母类(不包括在简单的代码示例中)

我真的需要帮忙,我整个下午都在做这件事,我想我已经检查了几乎每个SO和Github线程


提前感谢。

您需要区分第一个参数(创建
T
的实例)和第二个参数(类型
T

您现在应该会得到一个错误,即您正在传递的空对象丢失了
x
z
,正如您所期望的那样


作为旁注,考虑到创建
T
的实例,我不确定将
sourceData
键入为
T
的实例是否有意义。您还可以让
T
扩展一些东西,例如,它有一个
fromJson
方法,而不是
any

我不确定解决方案是什么,但您键入的方式意味着typescript希望
sourceData
buildClass
的一个实例,不仅仅是一个属性字典。@AlexWayne实际上我不想键入类实例,而是想将类本身作为第一个参数,将包含类属性的对象文本作为第二个参数,但我没有找到键入类本身的方法:“
buildOne(a,{})中的
不是吗?”
可以推断吗?@AlexWayne是的,可以省略,只是一个习惯而已。。。我甚至遇到了这样一个解决方案,但我一定是做错了什么。非常感谢您的见解!
ppublic static buildOne<T>(buildClass: new () => T, sourceData: Omit<T, 'fromJson'|'toJson'>): T
EntityBuilder.buildOne<A>(A, {})