将基类实例转换为派生类,无需在打字稿中进行类型转换
P粉451614834
P粉451614834 2024-02-25 19:48:09
0
2
434

我从基类扩展了一个新类并添加了一些属性。 如何使用给定基类(包括附加属性)创建派生类的实例?

此代码可以工作,但会强制转换类类型,并且不是类型安全

如何在不进行类型转换的情况下做到这一点?

// 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;
}

P粉451614834
P粉451614834

全部回复(2)
P粉765570115

我认为使用您的方法不可能完全排除类型转换,但是如果您使用 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;
}
P粉486138196

您可以使用 Object.assign () 方法 向目标对象添加属性。该方法返回目标对象,以及 其在 TypeScript 库中的调用签名输入类型的交集

这意味着你的 createCustomClass() 可以这样实现:

function createCustomClass(base: BaseClass, myValue: number): CustomClass {
  return Object.assign(base, { value: myValue });
}

返回类型为 BaseClass & {value: number},其结构与 CustomClass 相同,因此函数编译不会出错,且不存在 需要类型断言

Playground 代码链接 p>

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板