Search code examples
typescriptmethodsabstract-classfunction-definition

Typing method of a abstract class with an interface


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?


Solution

  • 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.

    1. Either declare Numbers as labeled tuple :
    type Numbers = [number1: number, number2: number, number3: number]
    
    // and use it
      public abstract functionMultiply(...props:Numbers): number
    
    1. Or pass it to functions as is (as object with three props):
    
    interface Numbers {
      number1: number
      number2: number
      number3: number
    }
    
     public abstract functionMultiply({number1, number2, number3}: Numbers): number