Rumah > Soal Jawab > teks badan
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
// 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粉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: 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粉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.