Машинопись возвращает typeof "это" - PullRequest
0 голосов
/ 05 августа 2020

Я использую библиотеку под названием Foo, которую вы используете, расширяя любой другой класс. Все методы Foo возвращают это.

Итак, Typescript должен понимать, что fromJson - это тот же тип класса BarFoo, но не

// library
class Foo {
    fromJson(obj:any) {
        if(obj == null) return obj;
        Object.assign(this, obj)
        // something else here
        return this;
    }
}
// usage
class BarFoo extends Foo{
    id:string
    foo(){

    }
}
const barFoo = new BarFoo().fromJson({id: 'foo'})
barFoo.foo(); // should have autocompleted foo()
barFoo.somethingNotExisting(); // should have errored out

Ответы [ 2 ]

3 голосов
/ 05 августа 2020

Проблема здесь в первом возврате: if(obj == null) return obj;. Typescript предполагает, что тип возврата fromJson равен any.

Вы можете решить эту проблему, возвращая null напрямую: if(obj == null) return null; или аннотируя метод с помощью типа возврата fromJson(obj: any): this {.

Имейте в виду, что с обоими решениями вы получите возможное значение null, возвращаемое методом. Таким образом, реальный тип возврата должен быть this | null.

2 голосов
/ 05 августа 2020

Так как у вас также есть случай возврата null, что означает, что правильный тип должен быть this | null:

class Foo {
    fromJson(obj: any): this | null {
      //
    }
}

Поэтому для использования с режимом strict, включенным в tsconfig.json, вам, возможно, придется проверьте значение NULL перед использованием:

const barFoo = new BarFoo().fromJson({id: 'foo'})
barFoo?.foo()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...