Typescript使我可以定义如下:
export enum LineType {
Adventure,
Lift
}
export type AdventureLine =
{
type: LineType.Adventure;
}
我可以在Flow中做类似的事情:
export const LineType = {
Adventure: "Adventure",
Lift: "Lift"
}
Object.freeze(LineType);
export type LineTypeEnum = $Enum<typeof LineType>;
export type AdventureLine =
{
type: LineType.Adventure;
}
但这不能编译type: LineType.Adventure;
-Flow说:“不能将字符串用作类型”。当然可以写type: "Adventure";
,但这不是很干。
那么如何在Flow中将字符串值用作文字类型?
答案 0 :(得分:1)
这样对您有用吗?
type LineType = { Adventure: "Adventure", Lift: "Lift" };
type AdventureLine = { type: $PropertyType<LineType, 'Adventure'> };
({ type: "Adventure" }: AdventureLine); // no error
({ type: "Lift" }: AdventureLine); // error
答案 1 :(得分:1)
this呢?
const Adventure: "Adventure" = "Adventure";
const Lift: "Lift" = "Lift";
export const LineType = { Adventure, Lift };
Object.freeze(LineType);
export type LineTypeEnum = $Enum<typeof LineType>;
export type AdventureLine =
{
type: typeof LineType.Adventure;
}
({ type: "Adventure" }: AdventureLine); // works
({ type: "x" }: AdventureLine); // gives erros
答案 2 :(得分:0)
(我知道这是一个老问题,但是它出现在搜索结果中,所以我想正确地回答如何使用现代Flow来解决这个问题。)
我认为,完成所需操作的方法是使用$Keys<T>
实用程序运算符。
https://flow.org/en/docs/types/utilities/#toc-keys
// @flow
const LineTypes = {
Adventure: "Adventure",
Lift: "Lift",
}
type LineType = $Keys<typeof LineTypes>
const geometryType = LineTypes.Adventure
const AdventureLine: LineType = 'Adventure'
// $ExpectError
const wontWork: LineType = 'Foo'
也要说明一下Flow与Typescript的Enum不完全相同的原因,这是因为Flow非常小心地只是一个类型系统,而Typescript是一种语言,因此它可以使用Enum之类扩展常规Javascript。因此,根本原因是:Javascript没有枚举,所以Flow没有枚举。一旦Javascript本身具有Enum,Flow也将支持它。