Структурное подтипирование в потоке может привести к потере информации:
type O = {x: number, y: number};
type P = {x: number, y: number, z: number}
function f(o: O) {
return o.x * 2, o.y * 2, o;
}
const p: P = {x: 2, y: 3, z: 100};
const r = f(p);
r.z // type error (property not found)
(Этот код ужасен, потому что он выполняет видимые мутации. Он предназначен только для иллюстративных целей.)
Я читал, что полиморфизм строк — это концепция, позволяющая избежать потери информации, не ставя под угрозу безопасность типов.
Есть ли способ добиться того же с полиморфизмом подтипа?
[ИЗМЕНИТЬ]
Чтобы обратиться к более широкой аудитории, я привожу краткое объяснение несколько пугающей терминологии:
- Полиморфизм — это просто красивое слово для определения эквивалентности двух типов, т. е. оно делает жесткую систему типов более гибкой.
- Параметрический полиморфизм (генерики в потоке) утверждает, что два типа всегда эквивалентны, потому что типы вообще не имеют значения.
- Полиморфизм подтипов (подтипирование в потоке) утверждает, что два типа эквивалентны, если вы можете вывести из них иерархию, т. е. включить подтип в его супертип.
- Полиморфизм строк похож на подтипирование, но решает проблему потери информации (однако технически связи подтипа больше нет, поэтому это не форма подтипирования).
- Ограниченный полиморфизм утверждает, что два типа эквивалентны только для определенной цели, например. равенство, порядок, отображение и т. д.