Как стать автором
Обновить

Комментарии 4

Считаете ли вы, что имитация номинативных типов через брендирование улучшает устойчивость программы?

Используем вот такую штуку года где-то с 2018-го:

export type Nominal<T, Name extends string> = T & { [Symbol.species]: Name };

применяется например вот так:

type Price = Nominal<number, 'Price'>;

Качество кода выросло очень заметно.

Я думаю, что brand лучше делать ключом, а не значением, чтобы были возможны штуки вроде Price & NonNegative. Что-то вроде:

const PriceBrand: unique symbol = Symbol();
type Price = number & { [typeof PriceBrand]: true };

Не стоит делать анонимные символы - отлаживать потом замучаетесь.

Беда с брендированием конкретно примитивных типов вроде number, в первую очередь, в том, что стандартные арифметические операторы ничего об этом не знают. Поэтому нужны либо makeUint на каждом шагу, либо свои функции-обертки вроде add(Uint, Uint). Я все надеюсь, что добавят перегрузки операторов на уровне объявлений, как сейчас есть для функций.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории