레코드를 배열에 매핑해야 했던 적이 있습니까?

4756 단어 typescript
타이핑을 유지합니까? 알아내는 데 시간이 조금 걸렸지만 이 문제를 완전히 해결하기 위해 이 함수를 작성했습니다!

function mapRecordToArray<T, R extends Omit<T, K>, K extends keyof T>(record: Record<string, R>, recordKeyName: K) {
  return Object.keys(record).map(key => ({ ...record[key as keyof typeof record], [recordKeyName]: key })) as T[]
}


사용법:

type Field = {
  name: string,
  label: string,
}

type Collection = {
  name: string,
  label: string,
  fields: Record<string, Omit<Field, 'name'>> | Field[]
}

const collections:Collections[] = [] // ...

collections.forEach(collection => {
  const fields = Array.isArray(collection.fields)
    ? collection.fields
    : mapRecordToArray(collection.fields, 'name')
})
// Function typings will look like this:
// function mapRecordToArray<Field, Omit<Field, "name">, "name">(record: Record<string, Omit<Field, "name">>, recordKeyName: "name"): Field[]

// Notice the return type: Field[]


그것이 다른 사람들을 도울 수 있기를 바랍니다! 다소 구체적일 수 있음을 인정하지만 😜

좋은 웹페이지 즐겨찾기