国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

將基底類別實例轉(zhuǎn)換為衍生類,無需在打字稿中進行類型轉(zhuǎn)換
P粉451614834
P粉451614834 2024-02-25 19:48:09
0
2
708

我從基類擴展了一個新類別並添加了一些屬性。 如何使用給定基底類別(包括附加屬性)建立衍生類別的實例?

此程式碼可以工作,但會強制轉(zhuǎn)換類別類型,並且不是類型安全性

如何在不進行型別轉(zhuǎn)換的情況下做到這一點?

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

我認(rèn)為使用您的方法不可能完全排除類型轉(zhuǎn)換,但是如果您使用type Guard 檢查變數(shù)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 () 方法 為目標(biāo)物件新增屬性。此方法傳回目標(biāo)對象,以及 其在 TypeScript 函式庫中的呼叫簽名輸入類型的交集。

這表示你的 createCustomClass() 可以這樣實作:

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

傳回型別為BaseClass & {value: number},其結(jié)構(gòu)與CustomClass 相同,因此函數(shù)編譯不會出錯,且不存在需要型別斷言。

Playground 程式碼連結(jié) p>#

最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板