Возможны ли несовместимые псевдонимы в FlowType?

Я думаю о чем-то вроде Haskell, где неявная передача между разными типами является ошибкой времени компиляции.

Я хотел бы иметь возможность сделать что-то вроде:

type Username = string;
type Password = string;

function login(username: Username, password: Password): void {
   // do some stuff
}

const username: Username = getUsername();
const password: Password = getPassword();

login(password, username); // ideally, should error

Попытка это, кажется, работает просто отлично. Мне интересно, может быть, мне нужно что-то, кроме псевдонима типа. Я думаю, что это возможно, если я оберну его в объект, но я не знаю.

Возможно ли такое?


person Ben Berman    schedule 12.07.2016    source источник


Ответы (3)


Вы можете эмулировать это, используя классы:

declare class Password {}

function passwordFromString(str: string): Password {
  return (str: any);
}

function passwordToString(pass: Password): string {
  return (pass: any);
}

function checkPassword(pass: Password): boolean {
  if (passwordToString(pass) === 'foo') {
    return true;
  }

  return false;
}
person vkurchatkin    schedule 12.07.2016
comment
Очень умный. Мне это нравится. - person Ben Berman; 13.07.2016

«Непрозрачные типы» — так это называется в Hack. Некоторые обсуждения их реализации в Flow здесь: https://github.com/facebook/flow/issues/1056#issuecomment-154876614

person Marshall Roch    schedule 13.07.2016

Непрозрачные типы были официально реализованы в потоке. Ознакомьтесь с документацией здесь: https://flow.org/en/docs/types/opaque-types/

person Jordan Brown    schedule 03.08.2017