Вот способ сделать то, что вы ищете ( Из этой статьи ):
interface Flavoring<FlavorT> {
_type?: FlavorT;
}
export type Flavor<T, FlavorT> = T & Flavoring<FlavorT>;
type Translated = Flavor<string, 'Translated'>;
type Identifier = Flavor<string, 'Identifier'>;;
function translate(key: Identifier): Translated {
return `translated ${key}`;
}
const a: Identifier = "a.b.c";
const b: Translated = "hello";
const run = () => {
const c = translate(b); // <- Fails
const d = translate(a); // <- OK
console.log({c, d});
};
Этот ароматизатор можно использовать с числами для широты, долготы. Или для идентификаторов: если вы хотите, чтобы UserId
и PostId
было невозможно поменять местами. Или что-нибудь, о чем вы можете подумать ... Очень удобно избегать переключения типов, которые в противном случае были бы одинаковыми.