Использование типов объединения с функцией, не принимающей аргументы в качестве объекта - PullRequest
0 голосов
/ 19 февраля 2019

Ниже приведена функция, которая использует union-типы.

type Shape = 
  { kind: 'circle', radius: number } |
  { kind: 'rectangle', w: number, h: number }

const getArea = (shape: Shape) => {     // this works
  switch(shape.kind) {
    case 'circle':
      return Math.PI * shape.radius ** 2
    case 'rectangle':
      return shape.w * shape.h
  }
  throw new Error('Invalid shape')
}

getArea({ kind: 'circle', radius: 10 })

Она принимает аргументы как объект, поэтому он работает.

Но как мне это сделать, когда функция не принимаетаргументы как объект.Пожалуйста, обратитесь к приведенному ниже примеру

type Shape = 
  { (kind: 'circle', ...args: [number]) } |
  { (kind: 'rectangle', ...args: [number, number]) }

const getArea: Shape = (kind, ...args) => {     // this doesn't work
  switch(kind) {
    case 'circle':
      return Math.PI * args[0] ** 2
    case 'rectangle':
      return args[0] * args[1]
  }
  throw new Error('Invalid shape')
}

getArea('circle', 10)
getArea('rectangle', 5, 5)

Кроме того, я могу пойти дальше и написать это так:

const getArea: Shape = (kind: 'update' | 'reset', ...args: [number] | [number, number]) => {

, но это не даст мне полной безопасности типа.Я хочу, чтобы аргументы менялись при изменении вида, как показано в первом примере.

Или есть другой подход к решению проблемы такого рода?

1 Ответ

0 голосов
/ 19 февраля 2019

Вы можете написать это так

const getArea = (...[key, ...args]: ['circle', number] | ['rectangle', number, number]) => {
    switch (key) {
        case 'circle':
            return Math.PI * args[0] ** 2
        case 'rectangle':
            return args[0] * args[1]
    }
    throw new Error('Invalid shape')
}

или

const getArea = (...args: ['circle', number] | ['rectangle', number, number]) => {
    switch (args[0]) {
        case 'circle':
            return Math.PI * args[1] ** 2
        case 'rectangle':
            return args[1] * args[2]
    }
    throw new Error('Invalid shape')
}
...