ค้นหาเว็บไซต์

typescript - วิธีแก้ปัญหา property ไม่อยู่บน 'Object'


ฉันเป็นมือใหม่กับ Typescript และไม่แน่ใจว่าควรตั้งคำถามนี้อย่างไร

ฉันจำเป็นต้องเข้าถึงคุณสมบัติสองอย่างที่เป็น "ไปได้" บนวัตถุที่ถูกส่งเข้ามาในตัวสร้าง ฉันรู้ว่ากำลังขาดการตรวจสอบบางอย่างเพื่อดูว่าพวกมันถูกกำหนดหรือไม่ แต่ Typescript กำลังแสดงข้อความ "Property does not exist on 'Object'" ข้อความนี้ปรากฏบนการคืนค่า selector และ template

class View {
    public options:Object = {};

   constructor(options:Object) {
       this.options = options;
   }

   selector ():string {
       return this.options.selector;
   }   

   template ():string {
       return this.options.template;
   }   

   render ():void {

   }   
}

ฉันแน่ใจว่ามันค่อนข้างง่าย แต่ Typescript เป็นสิ่งใหม่สำหรับฉัน

คำตอบ #1

ถ้าคุณใช้ชนิด any แทน Object คุณสามารถเข้าถึงคุณสมบัติใดๆ ได้โดยไม่มีข้อผิดพลาดในการคอมไพล์

อย่างไรก็ตาม ฉันขอแนะนำให้สร้างอินเทอร์เฟซที่ทำเครื่องหมายคุณสมบัติที่เป็นไปได้สำหรับวัตถุนั้น:

interface Options {
  selector?: string
  template?: string
}

เนื่องจากฟิลด์ทั้งหมดใช้ ?: หมายความว่าพวกมันอาจมีหรือไม่มีก็ได้ ดังนั้นสิ่งนี้จึงใช้ได้:

function doStuff(o: Options) {
  //...
}

doStuff({}) // empty object
doStuff({ selector: "foo" }) // just one of the possible properties
doStuff({ selector: "foo", template: "bar" }) // all props

ถ้ามีบางอย่างมาจากจาวาสคริปต์ คุณสามารถทำบางอย่างแบบนี้ได้:

import isObject from 'lodash/isObject'

const myOptions: Options = isObject(somethingFromJS) // if an object
    ? (somethingFromJS as Options) // cast it
    : {} // else create an empty object

doStuff(myOptions) // this works now

แน่นอนว่าการแก้ปัญหานี้จะได้ผลตามที่คาดไว้ก็ต่อเมื่อคุณไม่แน่ใจเพียงเกี่ยวกับการมีอยู่ของคุณสมบัติเท่านั้น ไม่ใช่ประเภทของมัน

คำตอบ #2

ถ้าคุณไม่ต้องการเปลี่ยนประเภทหรือสร้างอินเทอร์เฟซ คุณก็สามารถใช้ไวยากรณ์นี้เพื่อเข้าถึงคุณสมบัติที่ไม่รู้จักได้เช่นกัน:

selector ():string {
    return this.options["selector"];
}   

template ():string {
    return this.options["template"];
}

บทความที่เกี่ยวข้อง