Sitemap
Flow

The official publication for the Flow static type checker for JavaScript. Code faster. Code smarter. Code confidently.

Follow publication

New Flow Language Features for React

7 min readApr 3, 2024

--

Component Syntax Features

A Tour of Component Syntax

type Props = $ReadOnly<{
text?: string,
onClick: () => void,
}>;

export default function HelloWorld({
text = 'Hello!',
onClick,
}: Props): React.MixedElement {
return <div onClick={onClick}>{text}</div>;
}
export default component HelloWorld(
text: string = 'Hello!',
onClick: () => void,
) {
return <div onClick={onClick}>{text}</div>;
}

The Basics

Full compatibility

export default component HelloWorld(
'data-testid' as testid: string, // [1]
...otherProps: OtherProps // [2]
) {
return <div data-testid={testid} {...otherProps} /></div>;
}

Improved Safety

Ensuring props are deep read-only

type Item = { 
itemName: string,
arr: Array<number>,
};
type OtherProps = {
userId: number,
};

component UserItem(userItem: Item, ...props: OtherProps) {
props.userId = 0; // Error: react-rule-unsafe-mutation
userItem.itemName = "Cool New Laptop"; // Error: react-rule-unsafe-mutation

const copiedObj = {...userItem};
copiedObj.arr[0] = 3; // Error: Deep checking catches error through copied object
}

Enforcing best practices with Refs

component MyComponent() {
const renderCount = useRef<number>(0);
renderCount.current += 1; // error
return <div>{renderCount.current}</div> // error
}
component MyComponent() {
const renderCount = useRef<number>(0);
const [count, setCount] = useState(0);
useEffect(() => {
renderCount.current += 1; // ok
setCount(renderCount.current); // ok
}, [renderCount]);
return <div>{count}</div>
}

Hook Syntax

function useOnlineStatus(initial: boolean): boolean {
const [isOnline, setIsOnline] = useState(initial);
useEffect(() => {
// ...
}, []);
return isOnline;
}
hook useOnlineStatus(initial: boolean): boolean {
const [isOnline, setIsOnline] = useState(initial);
useEffect(() => {
// ...
}, []);
return isOnline;
}

Render Types

// Component library
export component Header() { ... }

export component Layout(
header: renders Header, // Library components can specify what props should render
) { ... }


// Product code
component MyHeader() renders Header { // Components can describe what they will ultimately render
// ...
return <Header />;
}

export component MyLayout() {
// OK! MyHeader renders Header
return <Layout header={<MyHeader />} />;
}

Try it out

Conclusion

--

--

Flow
Flow

Published in Flow

The official publication for the Flow static type checker for JavaScript. Code faster. Code smarter. Code confidently.

Responses (4)