Consider this trivial example:
abstract class Foo {
public abstract functionAdd(number1, number2, number3): number
public abstract functionMultiply(number1, number2, number3): number
}
interface Numbers {
number1: number
number2: number
number3: number
}
How can I use the interface Numbers
to describe parameters of both methods? Perhaps there's other - more idiomatic - way of defining abstract methods?
Please keep in mind that Numbers
contains unordered set of keys, just like HashMap whereas both functionAdd
and functionMultiply
expects an ordered tuple of arguments. In other words, These methods expect:
functionAdd(...[number1, number2, number3]:[number, number, number])
It means that there is no safe way to transform Numbers
into ordered tuple.
Actualy, there is a way to transform union to tuple but there is no order guarantee in unions.
SO, I believe you have two options.
Numbers
as labeled tuple :type Numbers = [number1: number, number2: number, number3: number]
// and use it
public abstract functionMultiply(...props:Numbers): number
interface Numbers {
number1: number
number2: number
number3: number
}
public abstract functionMultiply({number1, number2, number3}: Numbers): number