假设我有这个类和接口
class User {
name: string;
age: number;
isAdmin: boolean;
}
interface IUser {
name: string;
age: number;
}
然后我从某处获得这个json对象
const data = {
name: "John",
age: 25,
isAdmin: true
}
我希望使用data
对IUser
进行分组,并删除此类isAdmin
属性
let user = subset<IUser>(data);
// user is now { name: "John", age: 25 }
// can safely insert user in the db
我的问题是如何在TypeScript中实现该功能?
function subset<T>(obj: object) {
// keep all properties of obj that are in T
// keep, all optional properties in T
// remove any properties out of T
}
答案 0 :(得分:3)
没有办法比那更好:
function subset(obj: IUser) {
return {
name: obj.name,
age: obj.age
}
}
在运行时(调用subset
时)不存在typescript接口,因此您无法使用IUser
接口知道哪些属性需要,哪些属性不需要。
你可以使用一个在编译过程中“存活”的类但是:
class IUser {
name: string;
age: number;
}
编译为:
var IUser = (function () {
function IUser() {
}
return IUser;
}());
正如您所看到的,属性不是编译输出的一部分,因为类成员只添加到实例而不是类,因此即使是类也无法帮助您。
您可以使用装饰器和元数据(more on that here),但这对您的方案来说听起来有点过分。
更通用的subset
函数的另一个选项是:
function subset<T>(obj: T, ...keys: (keyof T)[]) {
const result = {} as T;
keys.forEach(key => result[key] = obj[key]);
return result;
}
let user1 = subset(data, "name", "age");
let user2 = subset(data, "name", "ag"); // error: Argument of type '"ag"' is not assignable to parameter of type '"name" | "age" | "isAdmin"'