Я ищу лучший способ различать различные типы строк в моей программе - например, абсолютные пути и относительные пути. Я хочу, чтобы иметь возможность принимать или возвращать определенный тип с ошибкой компилятора, если я его испортил.
Например,
function makeAbsolute(path: RelativePath): AbsolutePath {
}
где AbsolutePath и RelativePath и действительно просто строки. Я экспериментировал с псевдонимами типов, но на самом деле они не создают новый тип. Также интерфейсы -
interface AbsolutePath extends String { }
interface RelativePath extends String { }
но поскольку эти интерфейсы совместимы, компилятор не мешает мне их смешивать. Я не вижу, как я могу это сделать, не добавляя свойство к интерфейсу, чтобы сделать его несовместимым (и фактически добавив это свойство в строку или кастинг), либо используя класс-оболочку. Любые другие идеи?