我有两个类User
和Model
用户类扩展基类模型
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
,则不能使用anotherData
init,反之亦然。这就是我想要的我不想每次都在createFrom
中传递User
我只想要User.createFrom<IData>(data)
您不需要任何显式类型参数。TS足够聪明,可以从调用签名中推断类和数据类型:
User.createFrom(data);
// Model.createFrom<User, IData>(this: new () => User, data: IData): User