Add support for $ReadOnly and $Exact

master
Paul Loyd 2017-11-29 01:16:29 +03:00
parent c299ef0f06
commit 08dc16aa4b
5 changed files with 81 additions and 0 deletions

View File

@ -93,6 +93,14 @@ function shape(params: (?Type)[], resolve: TypeId => Type): ?Type {
};
}
function unwrap(params: (?Type)[]): ?Type {
invariant(params.length === 1);
const [type] = params;
return type ? clone(type) : null;
}
export default {
Object: object,
Buffer: buffer,
@ -102,4 +110,9 @@ export default {
$ElementType: elemType,
$NonMaybeType: stripMaybe,
$Shape: shape,
$ReadOnly: unwrap,
$Exact: unwrap, // TODO: another semantic for exact types?
// TODO: $Keys
// TODO: $Values
// TODO: $Diff
};

10
tests/samples/exact.js Normal file
View File

@ -0,0 +1,10 @@
type X = {
x: string;
y: boolean;
}
type Y = $Exact<X>;
type Z = $Exact<{z: string}>;
export type {Y, Z};

24
tests/samples/exact.json Normal file
View File

@ -0,0 +1,24 @@
{
"types": [
{
"id": ["exact", "X"],
"kind": "record",
"fields": [
{"name": "x", "value": {"kind": "string"}, "required": true},
{"name": "y", "value": {"kind": "boolean"}, "required": true}
]
},
{
"id": ["exact", "Y"],
"kind": "reference",
"to": ["exact", "X"]
},
{
"id": ["exact", "Z"],
"kind": "record",
"fields": [
{"name": "z", "value": {"kind": "string"}, "required": true}
]
}
]
}

10
tests/samples/readOnly.js Normal file
View File

@ -0,0 +1,10 @@
type X = {
x: string;
y: boolean;
}
type Y = $ReadOnly<X>;
type Z = $ReadOnly<{z: string}>;
export type {Y, Z};

View File

@ -0,0 +1,24 @@
{
"types": [
{
"id": ["readOnly", "X"],
"kind": "record",
"fields": [
{"name": "x", "value": {"kind": "string"}, "required": true},
{"name": "y", "value": {"kind": "boolean"}, "required": true}
]
},
{
"id": ["readOnly", "Y"],
"kind": "reference",
"to": ["readOnly", "X"]
},
{
"id": ["readOnly", "Z"],
"kind": "record",
"fields": [
{"name": "z", "value": {"kind": "string"}, "required": true}
]
}
]
}