Closed
Description
TypeScript Version: 3.2.1
Search Terms: generic pick exclude
Code
//
// Example 1
//
const fn = <Params extends {}>(
params: Pick<Params, Exclude<keyof Params, never>>,
): Params =>
// Unexpected error
/* Type 'Pick<Params, Exclude<keyof Params, never>>' is not assignable to type 'Params'. */
params;
//
// Example 2
//
import * as React from 'react';
import { ComponentType, FunctionComponent } from 'react';
type User = { name: string };
type UserProp = { user: User };
export const myHoc = function<ComposedComponentProps extends UserProp>(
ComposedComponent: ComponentType<ComposedComponentProps>,
) {
// These two should be equivalent, but they're not?
// Doesn't work:
type Props = Pick<
ComposedComponentProps,
Exclude<keyof ComposedComponentProps, never>
>;
// Works:
// type Props = ComposedComponentProps;
const Component: FunctionComponent<Props> = props => (
// Unexpected error
/* Type 'PropsWithChildren<Pick<ComposedComponentProps, Exclude<keyof ComposedComponentProps, never>>>' is not assignable to type 'IntrinsicAttributes & ComposedComponentProps & { children?: ReactNode; }'.
Type 'PropsWithChildren<Pick<ComposedComponentProps, Exclude<keyof ComposedComponentProps, never>>>' is not assignable to type 'ComposedComponentProps'. */
<ComposedComponent {...props} />
);
return Component;
};