Javascript 如何使流看到两种字符串类型不兼容?

Javascript 如何使流看到两种字符串类型不兼容?,javascript,flowtype,Javascript,Flowtype,我以前见过有人这样做,但我记不起语法,在文档中也找不到。我基本上想让两种类型都解析为同一个原语,它们彼此不兼容。一个例子应该非常清楚,我希望flow在代码中抛出一个错误: type tUsername = string; type tPassword = string; function validateUser(user: tUsername, password: tPassword) { } validateUser(('foo': tPassword), ('bar': tUserna

我以前见过有人这样做,但我记不起语法,在文档中也找不到。我基本上想让两种类型都解析为同一个原语,它们彼此不兼容。一个例子应该非常清楚,我希望flow在代码中抛出一个错误:

type tUsername = string;
type tPassword = string;

function validateUser(user: tUsername, password: tPassword) {
}

validateUser(('foo': tPassword), ('bar': tUsername));

上面的代码没有问题。在前两行中,您将两个变量的别名设置为键入
string
。因此,这两种类型是相同的

在最后一行,这两个值仍然有效,因为这两个参数本质上属于同一类型。即
字符串
。而
validateUser
需要字符串

为简化这一点,请考虑以下内容:

function validateUser(user: string, password: string) {
}

validateUser('foo', 'bar');
原始帖子中的代码,基本上就是这样。它仍然有效

如果您的类型从一开始就比较复杂(换句话说,不完全相同),那么如果切换参数,您应该会遇到一些错误。例如:

type tUser = {
  username: string,
  id: number,
};

type tPassword = {
  hash: string,
};

function validateUser(user: tUser, password: tPassword) {
}

const user: tUser = {
  id: 1,
  username: 'mark',
}

const password: tPassword = {
  hash: 'abcd1234',
}

validateUser(password, user); // should throw
这里有很多

您可以使用不透明类型别名解决您的问题

不透明类型别名是不允许访问其名称的类型别名 定义它们的文件之外的基础类型


是的,我知道代码没有问题。关键是我想把它扔出去。我希望能够告诉flow,
tPassword!=tUsername
即使它们都解析为
字符串
。因此,我想更改类型def或函数签名,以便调用抛出。您的建议可以在标称类型系统中实现,而不是流。@Wazeem:在流文档中:“导入不透明类型别名时,其行为类似于,隐藏其基础类型。”这仍然不符合OP的建议。@Wazeem:你确定吗?虽然链接的资源可能会解决这一问题,但举例说明它们是如何做到的,并解释它们是如何做到的,这将使答案(更)有用。太好了,谢谢!这需要对我的示例进行一些最小的更改,因为它不能在一个文件中工作,但这很好。@Wazeem:似乎不值得向下投票,特别是在不说明为什么它不能做OP想要做的事情(你认为)的情况下。