Я пытаюсь добиться с помощью TS следующего:
let m: Extendable
m.add('one', 1)
// m now has '.one' field
m.add('two', 2)
// 'm' now has '.one' and '.two' fields
Я знаком с возвратом расширенных типов в TS через:
function extend<T, V>(obj: T, val: V): T & {extra: V} {
return {
...obj,
extra: val
}
}
В моем случае есть две проблемы:
1) объект m
должен обновить свой тип после того, как add()
был вызван, чтобы отразить добавление нового поля
2) имя нового поля параметризовано (не всегда extra
, например)
Первую проблему можно решить, используя определение класса и каким-то образом используя утилиту TypeThis
для повторной настройки типа, но мне не удалось найти достаточно документации о том, как ее использовать.
Любая помощь или руководство приветствуются. Спасибо!
add()
является литерал, а не переменная. - person Abstract Algorithm   schedule 06.12.2019let e = new Extendable()
не будет работать, ноlet e: Extendable = new Extendable()
будет), поэтому я не уверен, стоит ли оно того. - person jcalz   schedule 07.12.2019