Tukar contoh kelas asas kepada kelas terbitan tanpa taip dalam skrip taip
P粉451614834
P粉451614834 2024-02-25 19:48:09
0
2
399

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粉451614834
P粉451614834

membalas semua(2)
P粉765570115

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

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan