-
Notifications
You must be signed in to change notification settings - Fork 12.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weβll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Control flow analysis for destructured rest element of discriminated union #46680
Comments
Yeah, might be nice to support. Though it's an expensive way to do it as you're incurring an extra object allocation. |
Yep, but par for the course for contexts like React where you might extract some props and forward the rest import React from 'react'
type Props =
| ({ as: "div" } & React.ComponentPropsWithRef<"div">)
| ({ as: "span" } & React.ComponentPropsWithRef<"span">)
function Component({ as, ...rest }: Props) {
if (as === 'div') {
return <div {...rest} />
}
if (as === 'span') {
return <span {...rest} />
}
// I think something like https://github.com/microsoft/TypeScript/issues/30581 would let us just do:
// return <as {...rest} />
} |
Can confirm this looks like something React devs do |
FYI, this is not only a React pattern, we would like to be able to write something like the following, based on #47190: type Message = {
method: string,
args: unknown[],
result?: string,
};
type KernelDeliveryMessage = [tag: 'message', target: string, msg: Message];
type KernelDeliveryNotify = [tag: 'notify', resolutions: string[] ];
type KernelDeliveryObject = KernelDeliveryMessage | KernelDeliveryNotify;
declare function translateMessage(target: string, msg: Message): any;
declare function translateNotify(resolutions: string[]): any;
type KernelDeliveryToVatDelivery = (...args: KernelDeliveryObject) => any;
const kernelDeliveryToVatDelivery:KernelDeliveryToVatDelivery = (type,...args) => {
switch (type) {
case 'message':
return translateMessage(...args);
case 'notify':
return translateNotify(...args);
default:
throw new Error(`unknown kernelDelivery.type ${type}`);
}
} Output"use strict";
const kernelDeliveryToVatDelivery = (type, ...args) => {
switch (type) {
case 'message':
return translateMessage(...args);
case 'notify':
return translateNotify(...args);
default:
throw new Error(`unknown kernelDelivery.type ${type}`);
}
}; Compiler Options{
"compilerOptions": {
"strict": true,
"noImplicitAny": true,
"strictNullChecks": true,
"strictFunctionTypes": true,
"strictPropertyInitialization": true,
"strictBindCallApply": true,
"noImplicitThis": true,
"noImplicitReturns": true,
"alwaysStrict": true,
"esModuleInterop": true,
"declaration": true,
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"target": "ES2017",
"module": "ESNext",
"moduleResolution": "node"
}
} Playground Link: Provided |
Suggestion
π Search Terms
rest spread element destructure destructuring discriminated union narrow refine
β Viability Checklist
My suggestion meets these guidelines:
β Suggestion
A natural extension of #46266 would be to support the following
π Motivating Example
π» Use Cases
The text was updated successfully, but these errors were encountered: