Как я могу защитить свои доменные типы с помощью TypeScript? - PullRequest
1 голос
/ 07 апреля 2020

Чтобы убедиться, что я не использую переменные в неправильном контексте, я хотел бы статически проверить мой код с типами, управляемыми доменом. Можно ли заставить компилятор предупреждать меня об использовании переведенной строки в качестве идентификатора в контексте ниже?

type Translated = string;
type Identifier = string;

function translate(key: Identifier): Translated {
  return `translated ${key}`;
}

const a: Identifier = "a.b.c";
const b: Translated = "hello";

const run = () => {
  const c = translate(b); // <- shouldn't this fail?
  console.log(c);
};

run();

Вот ссылка TypeScript Playground для приведенного выше кода.

1 Ответ

2 голосов
/ 07 апреля 2020

Вот способ сделать то, что вы ищете ( Из этой статьи ):

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 было невозможно поменять местами. Или что-нибудь, о чем вы можете подумать ... Очень удобно избегать переключения типов, которые в противном случае были бы одинаковыми.

...