Rumah  >  Soal Jawab  >  teks badan

Tukar contoh kelas asas kepada kelas terbitan tanpa taip dalam skrip taip

Saya melanjutkan kelas baharu daripada kelas asas dan menambah beberapa sifat. Bagaimana untuk membuat contoh kelas terbitan menggunakan kelas asas yang diberikan (termasuk sifat yang dilampirkan)?

Kod ini berfungsi tetapi menghantar jenis kelas dan bukan jenis selamat

Bagaimana untuk melakukan ini tanpa penukaran jenis?

// 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粉451614834P粉451614834236 hari yang lalu368

membalas semua(2)saya akan balas

  • P粉765570115

    P粉7655701152024-02-26 14:10:39

    Saya tidak fikir adalah mungkin untuk menolak sepenuhnya penyiapan taip menggunakan pendekatan anda, tetapi jika anda menggunakan type Guard 检查变量 result 是否有效 CustomClass (在我的实现中是 isCustomClass ) ia akan selamat:

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

    balas
    0
  • P粉486138196

    P粉4861381962024-02-26 11:51:43

    Anda boleh menggunakan kaedah Object.assign () untuk menambah sifat pada objek sasaran. Kaedah ini mengembalikan objek sasaran dan tandatangan panggilannya dalam perpustakaan TypeScript yang merupakan persimpangan jenis input.

    Ini bermakna createCustomClass() anda boleh dilaksanakan seperti ini:

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

    Jenis pulangan adalah BaseClass & {value: number},其结构与 CustomClass sama, jadi fungsi menyusun tanpa ralat dan tidak ada penegasan jenis yang diperlukan.

    Pautan kod taman permainan

    balas
    0
  • Batalbalas