Прошу помощи с обобщённые типами (generics)

120
06 октября 2019, 12:10

Не буду здесь приводить тонны своего кода, покажу на примере в чём проблема.

Есть какой-то класс (пусть будет Foo) с методом generateJson, который возвращает JSON типа FooGenerateJsonType:

@Component({})
export default class Foo {
    protected generateJson(): FooGenerateJsonType {
        return {
            data {
                test1: "TEST1"
            }
        }
    }
}
interface FooGenerateJsonType {
    data: FooGenerateJsonTypeData;
}
interface FooGenerateJsonTypeData {
    test1: string;
}

У FooGenerateJsonType есть data которая имеет тип FooGenerateJsonTypeData с набором каких-то своих параметров.

Есть второй класс (пусть будет Bar), который наследуется от Foo:

@Component({})
export default class Bar extends Foo {
    protected generateJson(): BarGenerateJsonType {
        return {
            data {
                test2: "TEST2",
                test3: "TEST3"
            }
        }
    }
}
interface BarGenerateJsonType {
    data: BarGenerateJsonTypeData;
}
interface BarGenerateJsonTypeData {
    test2: string;
    test3?: string;
}

Как видно, класс Bar переопределяет метод generateJson, но возвращает совершенно другой тип данных.

Скорее всего здесь уместно использовать generics. Подскажите, пожалуйста, как это грамотно сделать в моём случае? Ошибка примерно такая:

Property 'generateJson' in type 'Bar' is not assignable to the same property in base type 'Foo'. Type '() => BarGenerateJsonType' is not assignable to type '() => FooGenerateJsonType'.

Answer 1

Можно попробовать что-то вроде такого.

class Base<T> {
  generateJson(): T {
    return;
  }
}
interface FooGenerateJsonType {
  data: FooGenerateJsonTypeData;
}
interface FooGenerateJsonTypeData {
  test1: string;
}
class Foo extends Base<FooGenerateJsonType> {
   generateJson(): FooGenerateJsonType {
    return {
      data: {
        test1: 'TEST1'
      }
    };
  }
}
class Bar extends Base<BarGenerateJsonType> {
   generateJson(): BarGenerateJsonType {
    return {
      data: {
        test2: 'TEST2',
        test3: 'TEST3'
      }
    };
  }
}
interface BarGenerateJsonType {
  data: BarGenerateJsonTypeData;
}
interface BarGenerateJsonTypeData {
  test2: string;
  test3?: string;
}
READ ALSO
Подъем функции в ES6 [дубликат]

Подъем функции в ES6 [дубликат]

На данный вопрос уже ответили:

98
Модель, интерфейс, свервис [закрыт]

Модель, интерфейс, свервис [закрыт]

я начинающий веб-разработчик и на данный момент прохожу тестовое задание для вступления в компаниюСуть проблемы заключается в том, что тест...

121
Save to Drive Button

Save to Drive Button

Подскажите где найти пример как сделать Save to Drive Button на React, никак не могу найтиСпасибо

108
Проблема с переменнами JS [закрыт]

Проблема с переменнами JS [закрыт]

Как сделать что бы при каждом нажатию на кнопку переменная увеличивалось

99