Какое влияние оказывает ограничение extends со знаком равенства в определении универсального типа?

#typescript

Вопрос:

Я видел этот extends синтаксис:

 export type MyType<Data extends Base = Base> = { data: Data }
 

Что делает использование Base = Base do?

В машинописной документации по дженерикам это не объясняется.

Ответ №1:

Универсальный параметр по умолчанию — docs

Это позволяет вам вызывать MyType без общего параметра.

 type Base = { tag: 'Base' }

export type MyType<Data extends Base = Base> = { data: Data }

// type WithArgument = {
//     data: {
//         tag: 'Base';
//         name: 'John';
//     };
// }
type WithArgument = MyType<{ tag: 'Base', name: 'John' }>

// { data: Base; }
type Result = MyType 

 

Чистая аналогия js:

 const myType = (arg = { tag: 'Base' }) => arg
const result = myType() // { tag: 'Base' }
 

Это Data extends Base = Base означает, что:

  1. Данные должны расширять базу
  2. Если данные не предоставлены, используйте Базу по умолчанию

Вот как его можно разделить на две части:

  1. Data extends Base
  2. Data = Base

Вы не должны читать Base = Base отдельно от extends word

Ответ №2:

Это значение по умолчанию generic. Например:

 type MyType<Data extends Object = String> = { data: Data }

let test: MyType = {data: 'test'}; // Same as MyType<string>

console.log(typeof test.data); // prints string

let test2: MyType<Number> = {data: 5}; 

console.log(typeof test2.data); // prints number