TypeScript позволяет аргументам функции иметь разные типы в зависимости от значения аргументов.
Вот пример:
interface HTMLElement {
}
interface HTMLCanvasElement extends HTMLElement {
}
interface HTMLDivElement extends HTMLElement {
}
interface HTMLSpanElement extends HTMLElement {
}
interface Document {
createElement(tagName: string) : HTMLElement;
createElement(tagName: 'canvas'): HTMLCanvasElement;
createElement(tagName: 'div') : HTMLDivElement;
createElement(tagName: 'span') : HTMLSpanElement;
}
А есть ли еще языки, которые такое позволяют ?
И возможно ли это эмулировать на "обычных" языках с номинативной типизацией ?