Support readonly as Flow variance annotation (#19022)

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: fisker Cheung <lionkay@gmail.com>
This commit is contained in:
authored and GitHub committed 2026-04-12 07:43:22 +08:00
1 parent 9c044f33a8
commit 9d9d8914b6
5 files changed
+67 -3

No files matched your search

+19
View File
@@ -0,0 +1,19 @@
#### Support `readonly` as a variance annotation (#19022 by @marcoww6)
Flow now accepts `readonly` as a property variance annotation, equivalent to `+` (covariant/read-only).
<!-- prettier-ignore -->
```jsx
// Input
type T = {
readonly foo: string,
};
// Prettier stable
SyntaxError
// Prettier main
type T = {
readonly foo: string,
};
```
+2 -2
View File
@@ -218,8 +218,8 @@ function printFlow(path, options, print, args) {
return ["?", print("typeAnnotation")]; return ["?", print("typeAnnotation")];
case "Variance": { case "Variance": {
const { kind } = node; const { kind } = node;
assert.ok(kind === "plus" || kind === "minus"); assert.ok(kind === "plus" || kind === "minus" || kind === "readonly");
return kind === "plus" ? "+" : "-"; return kind === "plus" ? "+" : kind === "minus" ? "-" : `${kind} `;
} }
case "KeyofTypeAnnotation": case "KeyofTypeAnnotation":
return ["keyof ", print("argument")]; return ["keyof ", print("argument")];
+1 -1
View File
@@ -1200,7 +1200,7 @@ export type TypeAnnotationType =
export interface Variance extends BaseNode { export interface Variance extends BaseNode {
type: "Variance"; type: "Variance";
kind: "plus" | "minus"; kind: "plus" | "minus" | "readonly";
} }
interface BaseTypeAlias extends BaseNode { interface BaseTypeAlias extends BaseNode {
@@ -9,10 +9,40 @@ class Route {
static +param: T; static +param: T;
} }
class ReadonlyRoute {
static readonly param: T;
}
type ReadonlyObj = {
readonly foo: string,
readonly [string]: unknown
};
type ReadonlyTuple = [ readonly label: number ];
type ReadonlyInterface = interface {
readonly prop: string
};
=====================================output===================================== =====================================output=====================================
class Route { class Route {
static +param: T; static +param: T;
} }
class ReadonlyRoute {
static readonly param: T;
}
type ReadonlyObj = {
readonly foo: string,
readonly [string]: unknown,
};
type ReadonlyTuple = [readonly label: number];
type ReadonlyInterface = interface {
readonly prop: string,
};
================================================================================ ================================================================================
`; `;
+15
View File
@@ -1,3 +1,18 @@
class Route { class Route {
static +param: T; static +param: T;
} }
class ReadonlyRoute {
static readonly param: T;
}
type ReadonlyObj = {
readonly foo: string,
readonly [string]: unknown
};
type ReadonlyTuple = [ readonly label: number ];
type ReadonlyInterface = interface {
readonly prop: string
};