2021年11月30日

slug
2021-11-30
date
Nov 30, 2021
summary
Unionタイプ、搬入プロジェクト
status
Published
tags
プログラミング
type
Post
Property
 
 
const data = {
  price: 1000,
  enabled: true,
  text: 'hogehoge'
}

type Item<T, K extends keyof T> = {
  label: string
  key: K
  parser?: (value: T[K]) => string
}
type MappedTypeItem<T> = { [K in keyof T]: Item<T, K> }[keyof T]
type Items<T> = MappedTypeItem<T>[]

const items: Items<typeof data> = [
  {
    label: '金額',
    key: 'price',
    parser: (value) => value.toLocaleString()
  },
  {
    label: '可否フラグ',
    key: 'enabled',
    parser: (value) => value ? '可' : '否'
  },
  {
    label: 'テキスト',
    key: 'text'
  }
]

function outputList<T>(data: T, items: Items<T>) {
  items.forEach((item) => {
    const text = item.parser ? item.parser(data[item.key]) : data[item.key]
    console.log(item.label, text)
  })
}

outputList(data, items)
 

numberのunionタイプってできるのだろうか

type N = 1000 | 2000

const n: N = 3000  // Type '3000' is not assignable to type 'N'.
普通にできるな
 

© Yoshiyuki Hisamatsu 2021 - 2022