Typescript infer function parameters in derived class

Viewed 1060

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?

2 Answers

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;
        }
    }
}
Related