使用 partials 仅使用 class-specific 属性初始化 TypeScript 对象
Initializing TypeScript objects only with their class-specific properties using partials
考虑以下示例:
const assign = <T, K extends keyof T>(...args: T[]): T =>
args.reduce((result, current) =>
(Object.keys(current) as K[]).reduce((target, key) => {
target[key] = current[key];
return target;
}, result)
, args[0]);
class Base {
str1: string = '';
str2: string = '';
constructor(data: Partial<Base>) {
assign(this, data);
}
}
class Derived extends Base {
str3: string = '';
constructor(data: Partial<Derived>) {
super(data);
Object.assign(this, data);
}
}
const derivedObj = new Derived({ str1: 'text', str3: 'new prop' })
const baseObject = new Base(derivedObj);
console.log(baseObject);
// Outputs:
// Data { "str1": "text", "str2": "", "str3": "new prop" }
基础 class 包含的属性少于派生 class。基本 class 构造函数接受 Partial<Base>
,它也与 Partial<Derived>
类型兼容。这会导致在传递 Partial<Derived>
.
类型的对象时将无关属性分配给基础 class 对象
有没有一种方法可以仅使用其 class 特定属性(str
和 str2
以及 不是str3
)?
PS:GitHub和这里有很多看似相似的讨论。到目前为止,我还没有找到任何解决这个确切问题的方法。
这个有效:
const assign = <T, K extends keyof T>(...args: T[]): T =>
args.reduce((result, current) =>
(Object.keys(args[0]) as K[]).reduce((target, key) => {
if (current[key] !== undefined) target[key] = current[key];
return target;
}, result)
, args[0]);
看到这个playground
考虑以下示例:
const assign = <T, K extends keyof T>(...args: T[]): T =>
args.reduce((result, current) =>
(Object.keys(current) as K[]).reduce((target, key) => {
target[key] = current[key];
return target;
}, result)
, args[0]);
class Base {
str1: string = '';
str2: string = '';
constructor(data: Partial<Base>) {
assign(this, data);
}
}
class Derived extends Base {
str3: string = '';
constructor(data: Partial<Derived>) {
super(data);
Object.assign(this, data);
}
}
const derivedObj = new Derived({ str1: 'text', str3: 'new prop' })
const baseObject = new Base(derivedObj);
console.log(baseObject);
// Outputs:
// Data { "str1": "text", "str2": "", "str3": "new prop" }
基础 class 包含的属性少于派生 class。基本 class 构造函数接受 Partial<Base>
,它也与 Partial<Derived>
类型兼容。这会导致在传递 Partial<Derived>
.
有没有一种方法可以仅使用其 class 特定属性(str
和 str2
以及 不是str3
)?
PS:GitHub和这里有很多看似相似的讨论。到目前为止,我还没有找到任何解决这个确切问题的方法。
这个有效:
const assign = <T, K extends keyof T>(...args: T[]): T =>
args.reduce((result, current) =>
(Object.keys(args[0]) as K[]).reduce((target, key) => {
if (current[key] !== undefined) target[key] = current[key];
return target;
}, result)
, args[0]);
看到这个playground