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

typescript - ประเภท Union กับอินเตอร์เฟซ, รับรู้เฉพาะคุณสมบัติที่ใช้ร่วมกัน


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

คำตอบ #1

คุณจะต้องใช้สหภาพแบบแยกประเภท

interface Foo {
   id: string;
   name: string;
   type: "Foo";
}

interface Bar {
   id: string;
   phoneNumber: number;
   type: "Bar";
}

function baz(input: Foo | Bar) {
   if(input.type === "Bar") {
      input.phoneNumber 
   }
}

สนามเด็กเล่น

คำตอบ #2

input มีชนิด Foo | Bar ซึ่งหมายความว่า ในจุดนี้ สำหรับ TypeScript มันอาจจะเป็นสิ่งใดสิ่งหนึ่งในนั้น แต่ไม่สามารถระบุเพิ่มเติมได้ ดังนั้นมันจึงรู้แค่ id ซึ่งเป็นคุณสมบัติที่ใช้ร่วมกัน คุณควรมีการตรวจสอบชนิด ฉันจะทำอะไรประมาณนี้:

interface Foo{
  id:string;
  name:string;
  type:"Foo"

}

interface Bar{
  id:string;
  phoneNumber:string;
  type:"Bar"

}

function bas(input : Foo| Bar){
  if(input.type === "Bar"){
    input.phoneNumber
  }else{
    input.name
  }
}

สังเกตว่าฉันกำลังใช้คุณสมบัติ type นี้ ที่นี่มี TypeScript Playground หากคุณต้องการ