Open lazytype opened 3 years ago
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}`);
}
}
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 https://github.com/microsoft/TypeScript/pull/46266 would be to support the following
π Motivating Example
π» Use Cases