Ниже приведена функция, которая использует 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]) => {
, но это не даст мне полной безопасности типа.Я хочу, чтобы аргументы менялись при изменении вида, как показано в первом примере.
Или есть другой подход к решению проблемы такого рода?