Bagaimana pendekatan Anda dalam melakukan pencocokan pola di TypeScript?

Pendekatan manakah yang direkomendasikan untuk melakukan hal serupa seperti pencocokan pola di TypeScript? Hal terbaik yang pernah saya lakukan sejauh ini adalah memberikan "tag" -nilai unik untuk setiap antarmuka tupel dan melakukan pernyataan switch/case berdasarkan itu.

interface First { tag: 'one' }
interface Second { tag: 'two' }
type Third = First | Second

function match<T>(input: Third): T {
 switch( input.tag ){
   case 'one': {
   ...
   } 
   case 'two': {
   ...
   }
   default: {
   ...
   }
 }
}

Menurut pendapat saya, pendekatan ini masih kurang bersahabat dan tidak produktif dalam melakukan hal ini.

Saya sendiri tidak begitu yakin seberapa jauh Anda bisa mendorong ini karena TypeScript bukan tipe yang diketik kelas satu, tapi saya ingin mencobanya.


person Jimi Pajala    schedule 06.05.2018    source sumber
comment
Saya tahu ini sepertinya mengganggu bahasanya, tapi sebenarnya ini bukan masalah besar, dan bahkan mungkin merupakan hal yang baik.. juga, seseorang mungkin mencoba menyarankan untuk menggunakan kelas dan instanceof, tapi itu bukan ide yang bagus -- instanceof merupakan penghalang untuk memberikan tiruan yang baik untuk pengujian -- antarmuka alih-alih instanceof adalah kekuatan dari skrip ketikan   -  person ChaseMoskal    schedule 06.05.2018


Jawaban (1)


mungkin menggunakan enum untuk ini

enum Tag {
  One,
  Two,
  Three
}

interface Taggable {
  tag: Tag
}

interface Alpha extends Taggable {
  tag: Tag.One
  a: number
}

interface Bravo extends Taggable {
  tag: Tag.Two
  b: number
}

function match<gTaggable extends Taggable = Taggable>(
  taggable: gTaggable
): gTaggable {
  switch(taggable.tag) {

    case Tag.One: {
      const {tag, a} = taggable
      // ...
      break
    }

    case Tag.Two: {
      const {tag, b} = taggable
      // ...
      break
    }

    default: {
      throw new Error(`unknown taggable "${taggable.tag}"`)
    }
  }
}

jika Anda merasa sangat nakal, Anda dapat menggunakan simbol alih-alih enum untuk hal-hal seperti ini

person ChaseMoskal    schedule 06.05.2018