Casper-SC
@Casper-SC
Программист (.NET)

Тема в справке по TypeScript — Generic parameter defaults. Чем является T?

Всем привет. Смотрю проект на TypeScript, увидел непонятную мне конструкцию. Нагуглил справку. Посмотрел, но всё-таки не понял, что же в итоге такое T? Примерный вид кода, который я смотрю:
export type IAllParams =
    | IPersonParams
    | ICompanyParams

export interface ISomeType<T extends IBaseParams = IAllParams> {
    identifier?:string;
}

export interface IBaseParams {
    title?:string;
}

В моём случае, что такое T? То есть IBaseParams = IAllParams означает, что T может быть или IBaseParams или IAllParams? Или что это значит?

Я не полез писать проект не зная TypeScript и пока нет необходимости и времени его учить (хотя желание в будущем это сделать есть). Просто нужно понять пока конкретно эту конструкцию. Я понимаю, что такое обобщения, но именно такая конструкция мне непонятна.

Generic parameter defaults

Было:
declare function create(): Container<HTMLDivElement, HTMLDivElement[]>;
declare function create<T extends HTMLElement>(element: T): Container<T, T[]>;
declare function create<T extends HTMLElement, U extends HTMLElement>(
  element: T,
  children: U[]
): Container<T, U[]>;


Стало:
declare function create<T extends HTMLElement = HTMLDivElement, U = T[]>(
  element?: T,
  children?: U
): Container<T, U>;


Я всё же не понял, чем может быть T? То есть HTMLElement = HTMLDivElement означает, что T может быть или HTMLElement или HTMLDivElement? Или что это значит?
  • Вопрос задан
  • 93 просмотра
Решения вопроса 1
@StockholmSyndrome
1)
function a<T extends SomeType>(arg: T): void {
  // ...
}
данная конструкция означает, что обобщённый тип T должен иметь все свойства SomeType
https://www.typescriptlang.org/docs/handbook/2/gen...

2)
function a<T = SomeType>(arg: T): void {
  // ...
}
в данном случае мы задаём дефолтное значение для обобщённого типа T, то есть по умолчанию он будет равен SomeType, подобно параметрам по умолчанию в обычном javascript

function a<T extends SomeType = DefaultType>(arg: T): void {
  // ...
}
сливая всё воедино, мы получаем, что обобщённый тип T должен быть расширением SomeType и по умолчанию равен DefaultType (который тоже должен являться расширением SomeType)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы