在Flow中对内置类型进行子分类
Subtyping built-in types in Flow
假设我正在编写处理uuid的代码。在内部,我想将它们表示为字符串。也就是说,每个UUID都是字符串,但不是每个字符串都是有效的UUID,而且我不希望意外地将错误的东西赋给用于保存UUID的变量。所以我想创建一个类型'uuid',这样赋值就会失败:
let foo: uuid = "Some string"
但这应该成功:
function create_uuid(): uuid; { /* implementation? */ }
let foo: uuid = create_uuid();
let bar: string = uuid; // this is fine
是否有任何方法可以创建具有这些属性的流类型?我在我的研究中发现了$Subtype
,并认为这可能有效:
type uuid = $Subtype<string>;
但是由于某些原因,它仍然允许从字符串中赋值
有以下hack(缺点是UUID
也将是Object
):
// keep this constructor private
class IsUUID {}
export type UUID = string & IsUUID;
export function create(): UUID {
const uuid = 'blah' // <= your implementation
return ((uuid: any): UUID)
}
// tests
declare function f(uuid: UUID): void;
declare function g(s: string): void;
declare function h(o: Object): void;
let foo = create()
let bar: string = foo // <= ok
f(foo) // <= ok
f(bar) // <= error: string. This type is incompatible with IsUUID
g(foo) // <= ok
g(bar) // <= ok
h(foo) // <= ok :(
编辑:这个答案已经过时了。自从提出这个问题以来,Flow已经实现了不透明类型。参考ESRogs的回答
可能有一些hack可以解决这个问题,但是你要求的是一个不透明的数据类型,Flow目前不支持它们。以下是GitHub上Flow存储库对它们的一些讨论。
使用带有子类型约束的不透明类型。来自文档:
exports.js
export opaque type ID: string = string;
imports.js
import type {ID} from './exports';
function formatID(x: ID): string {
return "ID: " + x; // Ok! IDs are strings.
}
function toID(x: string): ID {
return x; // Error: strings are not IDs.
}
https://flow.org/en/docs/types/opaque-types/相关文章:
- 具有输入类型文件字段的语义UI重置表单
- 在javascript中定义内置类型的方法
- 重置输入类型=释放鼠标时的范围
- 单击输入类型=搜索时重置按钮的任何事件
- 如何在 Javascript 中重置电子邮件输入类型选择器
- JQuery表分类器未捕获类型错误:对象#<HTML文档>没有方法'准备就绪'
- 将新属性分配给内置类型实际上是非法的
- 未捕获的错误:不变冲突:元素类型无效:需要字符串(对于内置组件)或类/函数,但得到:对象
- javascript加载带按钮类型重置的重置表单如何使用字段
- react router问题未捕获错误:不变冲突:元素类型无效:应为字符串(用于内置组件)
- 在Flow中对内置类型进行子分类
- 扩展JavaScript的内置类型 - 它是邪恶的吗?
- 重新分配内置类型的原型
- 如何排序教科书的类型,颜色代码,或分类在bookweb使用html, Javascript, CSS或其他
- Node.js/JavaScript内置类型的存根
- 内置JavaScript类型名称的大小写
- 元素类型无效:期望是字符串(对于内置组件)或类/函数(对于复合组件),但得到:未定义
- 未捕获的类型错误:无法读取属性'重置'在Javascript中为null
- AngularJS没有正确处理按钮类型=“”;重置”;
- Screeps 内置函数不返回预期的类型