البرمجة الكائنية - كيف تأخذ مجموعة فرعية من كائن باستخدام واجهة؟
افترض أن لدي هذه الفئة والواجهة
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
}
الإجابة رقم 1
لا توجد طريقة للقيام بذلك تكون أفضل من:
function subset(obj: IUser) {
return {
name: obj.name,
age: obj.age
}
}
واجهات تايب سكريبت غير موجودة أثناء وقت التشغيل (وهو الوقت الذي يتم فيه استدعاء subset) لذلك لا يمكنك استخدام واجهة IUser لمعرفة الخصائص المطلوبة وأيها غير مطلوب.
يمكنك استخدام فئة تقوم بـ "البقاء" أثناء عملية التحويل لكن:
class IUser {
name: string;
age: number;
}
يترجم إلى:
var IUser = (function () {
function IUser() {
}
return IUser;
}());
كما ترى، الخصائص ليست جزءًا من الناتج المترجم، حيث يتم إضافة أعضاء الفئة فقط إلى النسخة وليس إلى الفئة نفسها، لذلك حتى الفئة لن تساعدك.
يمكنك استخدام المزخرف والبيانات الوصفية (المزيد عن ذلك هنا) لكن هذا يبدو مبالغة لحالتك.
خيار آخر لدالة 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"'
