镜像站点 · 本页由第三方 GitHub 只读镜像提供,非 GitHub 官方站点,不接受任何登录或凭据输入。前往 github.com
Skip to content

Error spans are not close enough to missing properties on deeply nested object literals #22170

Description

@pelotom

TypeScript Version: all recent versions, including @next

Search Terms:

missing property literal error

Code

Consider this simplified example:

type Foo = {
    bar: {
        baz: {
            qux: {
                quux: {
                    corge: {
                        grault: {
                            garply: {
                                waldo: {
                                    fred: {
                                        plugh: {
                                            xyzzy: {
                                                thud: {}
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

const foo: Foo = {
    //^^^ error annotated here
    bar: {
        baz: {
            qux: {
                quux: {
                    corge: {
                        grault: {
                            garply: {
                                waldo: {
                                    fred: {
                                        plugh: {
                                            xyzzy: {
                                              // ... for property missing here
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

Expected behavior:

The error location should be that of the innermost part of the object literal where the property is missing.

Actual behavior:

The location is reported on the variable being assigned to. The pain of this is exacerbated dramatically if each of the intervening levels of nesting has lots of other properties too. It becomes incredibly laborious to find the real source of the problem.

Playground Link

Context

For context, my real-world use case is typing of Vega JSON specs, which are realized programmatically as large object literals, e.g.

const barChart: Spec = {
  $schema: 'https://vega.github.io/schema/vega/v3.json',
  width: 400,
  height: 200,
  padding: 5,

  data: [
    {
      name: 'table',
      values: [
        { category: 'A', amount: 28 },
        { category: 'B', amount: 55 },
        { category: 'C', amount: 43 },
        { category: 'D', amount: 91 },
        { category: 'E', amount: 81 },
        { category: 'F', amount: 53 },
        { category: 'G', amount: 19 },
        { category: 'H', amount: 87 },
      ],
    },
  ],

  signals: [
    {
      name: 'tooltip',
      value: {},
      on: [
        { events: 'rect:mouseover', update: 'datum' },
        { events: 'rect:mouseout', update: '{}' },
      ],
    },
  ],

  scales: [
    {
      name: 'xscale',
      type: 'band',
      domain: { data: 'table', field: 'category' },
      range: 'width',
      padding: 0.05,
      round: true,
    },
    {
      name: 'yscale',
      domain: { data: 'table', field: 'amount' },
      nice: true,
      range: 'height',
    },
  ],

  axes: [{ orient: 'bottom', scale: 'xscale' }, { orient: 'left', scale: 'yscale' }],

  marks: [
    {
      type: 'rect',
      from: { data: 'table' },
      encode: {
        enter: {
          x: { scale: 'xscale', field: 'category' },
          width: { scale: 'xscale', band: 1 },
          y: { scale: 'yscale', field: 'amount' },
          y2: { scale: 'yscale', value: 0 },
        },
        update: {
          fill: { value: 'steelblue' },
        },
        hover: {
          fill: { value: 'red' },
        },
      },
    },
    {
      type: 'text',
      encode: {
        enter: {
          align: { value: 'center' },
          baseline: { value: 'bottom' },
          fill: { value: '#333' },
        },
        update: {
          x: {
            scale: 'xscale',
            signal: 'tooltip.category',
            band: 0.5,
          },
          y: {
            scale: 'yscale',
            signal: 'tooltip.amount',
            offset: -2,
          },
          text: { signal: 'tooltip.amount' },
          fillOpacity: [{ test: 'datum === tooltip', value: 0 }, { value: 1 }],
        },
      },
    },
  ],
};

(This is a relatively small example as Vega specs go.) If any of the required properties at a deeply nested level is missing, the spec variable is annotated with the error, and one has to hunt through the long error message to discover where the actual problem lies.

Activity

  1. Kingwl commented on Feb 28, 2018

    @Kingwl
    Contributor

    is this issue in community milestone?

  2. DanielRosenwasser commented on Feb 28, 2018

    @DanielRosenwasser
    Member

    It's not clear if we can even fix this without a decent amount of code complexity, since the error can be very non-local, but it's worth a shot. If you'd like to send a PR, we'd appreciate it!

  3. changed the title [-]Error markers are not localized properly for missing properties on deeply nested object literals[/-] [+]Error spans are not close enough to missing properties on deeply nested object literals[/+] on Feb 28, 2018
  4. added this to the milestone on Apr 26, 2018
  5. DanielRosenwasser commented on Jul 28, 2018

    @DanielRosenwasser
    Member

    I think that Wesley Wigham (@weswigham) fixed this in TypeScript 3.0 (#25030 bug and #25140 for fix).

  6. DanielRosenwasser commented on Jul 28, 2018

    @DanielRosenwasser
    Member

    image

  7. pelotom commented on Jul 29, 2018

    @pelotom
    Author

    Thanks, this is great to hear!

  8. locked as resolved and limited conversation to collaborators on Oct 21, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

BugA bug in TypeScriptDomain: Error MessagesThe issue relates to error messagingEffort: ModerateRequires experience with the TypeScript codebase, but feasible. Harder than "Effort: Casual".FixedA PR has been merged for this issueHelp WantedYou can do this

Type

No type

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions