Skip to content

Simplify error messages against intersections of weak types #24146

Open
@DanielRosenwasser

Description

@DanielRosenwasser

I spoke a bit with @sandersn about ways we can tackle the type madness issue (#14662). I noted that JSX scenarios are much more broadly applicable right now and are pretty prevalent given the sorts of type arithmetic we see a lot of in the React community. 😃

Problem: JSX optional attributes make errors too hard to read

interface FooProps {
    name: string;
    age: number;
}

class Foo extends React.Component<FooProps> {
    constructor(props: FooProps) {
        super(props)
    }
    render() {
        const {name, age} = this.props;
        return <div>I'm {name} and am {age} years old</div>;
    }
}

// Type '{ blah: number; }' is not assignable to type 'IntrinsicAttributes & IntrinsicClassAttributes<Foo> & Readonly<{ children?: ReactNode; }> & Reado...'.
//   Type '{ blah: number; }' is not assignable to type 'Readonly<FooProps>'.
//     Property 'name' is missing in type '{ blah: number; }'.
<Foo blah={10} />;

Proposal

When doing relation checks against an intersection target, if a check fails, see if relating against the same type with weak types removed would result in the same outcome. If so, use that comparison when elaborating types.

The great part is that this actually solves a broader set of problems than just JSX.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions