Потому что если танцевать с js, то танцевать как надо:
Str.prototype.word = 'word'
А вообще
interface StrInterface {
text: string
word: string
}
class Str implements StrInterface {
text = 'hello'
word: string = ''
}
Str.prototype.word = 'word'
const s = new Str()
console.log(s.text)
console.log(s.word)
upd: Ситуативно через prototype - да, ты можешь "расширять" классы, но для таких ситуаций придуман "extends", который позволяет тебе расширять класс с дополнительными свойствами. И это будет правильно, потому что присвоение свойств напрямую, либо через тот же prototype - может происходить хаотично, например:
setInterval(() => {
++count
Str.prototype.word = count % 2 == 0 ? 'word' : 'not word'
}, 1000)
Str.prototype.word = 'word'
И это сработает.
Сделано это из-за GC (garbagecollector).
И такое хаотичное присвоение свойств (чего-либо) считается плохой практикой. Точно так же со стрелочными функциями, которые создаются заново каждый раз и так-же могут упираться в какую-то кондицию, которая каждое исполнение скрипта может их выполнять в разных вариациях (попробуй экспортировать: export default () => { ... }). Точно так-же - все импорты - иммутабельны. Даже если ты экспортируешь так: export let value = 'word', то при импорте в другой модуль - ты этот value не изменишь, никак.