В чём отличие extended от initialValue когда мы определяем generic type?

Когда мы определяем generic type в TypeScript, мы можем указать два параметра: extended и initialValue. Оба этих параметра влияют на поведение и функциональность generic type, однако их отличие заключается в своем назначении.

Параметр extended используется для расширения уже существующего типа путем добавления дополнительных свойств или методов к нему. При использовании extended, мы можем указать новые свойства или методы, которые будут присутствовать в generic type, в дополнение к тем, которые уже определены для базового типа. Например, если у нас есть базовый тип Person с свойствами name и age, мы можем создать generic type ExtendedPerson, расширив базовый тип с помощью параметра extended, и добавить новое свойство gender:

type Person = {
  name: string;
  age: number;
};

type ExtendedPerson<T extends Person> = T & {
  gender: string;
};

const person: ExtendedPerson<Person> = {
  name: "John",
  age: 25,
  gender: "male",
};

В приведенном примере ExtendedPerson является generic type, который расширяет базовый тип Person путем добавления свойства gender. Теперь объект person имеет все свойства из базового типа Person и дополнительное свойство gender.

Параметр initialValue, с другой стороны, используется для указания начального значения, которое будет использоваться по умолчанию для generic type. Если явно не указано другое значение при создании переменной с использованием generic type, будет использоваться значение, указанное в параметре initialValue. Например:

type Box<T = any> = {
  value: T;
};

const box: Box<string> = {
  value: "Hello",
};

const boxWithDefault: Box = {
  value: 10,
};

В приведенном примере Box является generic type, который содержит одно свойство value. При создании типа Box<string> инициализируется переменная box со значением "Hello". А при создании типа Box без указания типа параметра, создается переменная boxWithDefault со значением 10, так как initialValue по умолчанию равно any.

Таким образом, отличие между extended и initialValue заключается в их назначении: extended используется для расширения базового типа generic type, добавляя новые свойства или методы, а initialValue используется для указания начального значения по умолчанию для generic type, если не указано явное значение.