我从基类扩展了一个新类并添加了一些属性。 如何使用给定基类(包括附加属性)创建派生类的实例?
此代码可以工作,但会强制转换类类型,并且不是类型安全
// Base class is imported from a package. Not editable
class BaseClass {
public x: number;
public power() {
return this.x * 2;
}
}
export interface CustomClass extends BaseClass {
value: number;
}
function createCustomClass(base: BaseClass, myValue: number): CustomClass {
// it's not type safe to cast this variable
// How to do it the right way in Typescript?
const result: CustomClass = base as CustomClass;
result.value = myValue;
return result;
}
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
我认为使用您的方法不可能完全排除类型转换,但是如果您使用
type Guard检查变量result是否有效CustomClass(在我的实现中是isCustomClass),那将是安全的: p>// Base class is imported from a package. Not editable class BaseClass { public x: number; public power() { return this.x * 2; } } export interface CustomClass extends BaseClass { value: number; } function isCustomClass(classToCheck: any): classToCheck is CustomClass { return ( typeof classToCheck?.value === "number" && classToCheck instanceof BaseClass ); } function createCustomClass(base: BaseClass, myValue: number): CustomClass { const result = base; (result as CustomClass).value = myValue; if (!isCustomClass(result)) { throw new Error("Cannot create valid `CustomClass`"); } return result; }您可以使用
Object.assign ()方法 向目标对象添加属性。该方法返回目标对象,以及 其在 TypeScript 库中的调用签名是 输入类型的交集。这意味着你的
createCustomClass()可以这样实现:function createCustomClass(base: BaseClass, myValue: number): CustomClass { return Object.assign(base, { value: myValue }); }返回类型为
BaseClass & {value: number},其结构与CustomClass相同,因此函数编译不会出错,且不存在 需要类型断言。Playground 代码链接 p>