从父类静态方法typescript创建子类对象



我有两个类UserModel用户类扩展基类模型

class User extends Model {}

模型类有静态方法createFrom

static createFrom<T, K>(this: new () => T, data: K): T {}

我可以像这样调用这个方法

User.createFrom<User, DataType>({...data_of_DataType});
User.createFrom<User, OtherDataType>({...data_of_OtherDataType});

正如你所看到的,我必须在泛型中定义User,每次当我必须添加泛型DataType时,我想要这样的东西。

User.createFrom<DataType>({...data_of_DataType});

是否有可能不从createFrom中删除通用T,因为我需要在createFrom中返回类型

.

这里是最小可复制示例,你可以查看

更新2

// Lib
function convertDataIntoClass(cls: any, data: any){
// convert data into class obj and return
return cls;
}
// End Lib
class Model {
static createFrom<T, K>(this: new () => T, data: K): T {
return convertDataIntoClass(this, data);
}
}
class User extends Model {}

interface IData {
id: string;
}
interface IAnotherData {
name: string;
}
const anotherData: IAnotherData = {name: "id-123"};
const data: IData = {id: "id-123"};
// It work like this
User.createFrom<User, IData>(data);
// You can't create with other data
User.createFrom<User, IData>(anotherData); // Error, this is what I want
// Create user with other type
User.createFrom<User, IAnotherData>(anotherData);

// I want something like this
User.createFrom<IData>(data);

游乐场

在示例中可以看到,如果显式定义数据类型,则不能使用任何其他数据类型。例如User.createFrom<User, IData>(anotherData),如果您定义了IData,则不能使用anotherDatainit,反之亦然。这就是我想要的我不想每次都在createFrom中传递User我只想要User.createFrom<IData>(data)

您不需要任何显式类型参数。TS足够聪明,可以从调用签名中推断类和数据类型:

User.createFrom(data);
// Model.createFrom<User, IData>(this: new () => User, data: IData): User

相关内容

  • 没有找到相关文章

最新更新