Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Typescript infer function parameters in derived class

I noticed that when implementing a generic interface (or class) and explicitly stating the types of those generics, the parameter types for functions inside the subclass are not inferred.

interface MyInterface<T> {
    open(data: T): void
}

class MyClass implements MyInterface<string> {
    open(data) {
        // Data should be string, but is any
    }
}

The current correct way to do this would be the following:

open(data: string) {
    ...
}

However, this forces me to enter the type multiple times which seems unnecessary. The following produces an error (which is expected):

open(data: number) {
    ...
}

Any type that isn't string gives an error, so shouldn't the compiler be able to infer that the type is string?

like image 893
Viktor W Avatar asked Aug 31 '18 23:08

Viktor W


2 Answers

This is a known issue in TypeScript that may be fixed at some point.

like image 167
Matt McCutchen Avatar answered Oct 12 '22 23:10

Matt McCutchen


As the other answer says, this is known issue with TypeScript compiler.

There is a way to provide implementation of MyInterface for which method parameters will be inferred, you just have to use a function that returns an object instead of a class:

interface MyInterface<T> {
    open(data: T): void
}


function createMyObject(): MyInterface<string> {
    return {
        open(data) { // data type is inferred as string here
            const n = data.length;
        }
    }
}
like image 39
artem Avatar answered Oct 13 '22 00:10

artem