Code view:

A painting is a person's account of this edit as text, recorded independently of the node mapping - a rendering often has several equally defensible answers where the mapping has one. Deletions and insertions carry no position on the opposite side in a painting, so that panel draws no caret for them.

Before

…lines 1–12 unchanged (12 lines)
13let a = p.a.toFixed();
14let b = p.b.substring(1);
15// Should error even though 'd' is in 'Keys'
16let d = p.d;
17
18
19//// [typeSatisfaction_propNameConstraining.js]
20const p = {
21 a: 0,
22 b: "hello",
23 x: 8 // Should error, 'x' isn't in 'Keys'
24};
25// Should be OK -- retain info that a is number and b is string
…lines 26–30 unchanged (5 lines)

After

…lines 1–13 unchanged (13 lines)
14let b = p.b.substring(1);
15// Should error even though 'd' is in 'Keys'
16let d = p.d;
17
18
19//// [typeSatisfaction_propNameConstraining.js]
20"use strict";
21const p = {
22 a: 0,
23 b: "hello",
24 x: 8 // Should error, 'x' isn't in 'Keys'
25};
26// Should be OK -- retain info that a is number and b is string
…lines 27–31 unchanged (5 lines)

Before

program
comment "//// [tests/cases/conformance/expressions/typeSatisfaction/t"...
comment "//// [typeSatisfaction_propNameConstraining.ts]"
ERROR
identifier "type"
expression_statement (+27 nodes collapsed)
lexical_declaration (+42 nodes collapsed)
comment "// Should be OK -- retain info that a is number and b is str"...
lexical_declaration
let "let"
variable_declarator
identifier "a"
= "="
call_expression
member_expression
member_expression
identifier "p"
. "."
property_identifier "a"
. "."
property_identifier "toFixed"
arguments
( "("
) ")"
; ";"
lexical_declaration
let "let"
variable_declarator
identifier "b"
= "="
call_expression
member_expression
member_expression
identifier "p"
. "."
property_identifier "b"
. "."
property_identifier "substring"
arguments
( "("
number "1"
) ")"
; ";"
comment "// Should error even though 'd' is in 'Keys'"
lexical_declaration
let "let"
variable_declarator
identifier "d"
= "="
member_expression
identifier "p"
. "."
property_identifier "d"
; ";"
comment "//// [typeSatisfaction_propNameConstraining.js]"
lexical_declaration (+27 nodes collapsed)
comment "// Should be OK -- retain info that a is number and b is str"...
lexical_declaration
let "let"
variable_declarator
identifier "a"
= "="
call_expression
member_expression
member_expression
identifier "p"
. "."
property_identifier "a"
. "."
property_identifier "toFixed"
arguments
( "("
) ")"
; ";"
lexical_declaration
let "let"
variable_declarator
identifier "b"
= "="
call_expression
member_expression
member_expression
identifier "p"
. "."
property_identifier "b"
. "."
property_identifier "substring"
arguments
( "("
number "1"
) ")"
; ";"
comment "// Should error even though 'd' is in 'Keys'"
lexical_declaration
let "let"
variable_declarator
identifier "d"
= "="
member_expression
identifier "p"
. "."
property_identifier "d"
; ";"

After

program
comment "//// [tests/cases/conformance/expressions/typeSatisfaction/t"...
comment "//// [typeSatisfaction_propNameConstraining.ts]"
ERROR
identifier "type"
expression_statement (+27 nodes collapsed)
lexical_declaration (+42 nodes collapsed)
comment "// Should be OK -- retain info that a is number and b is str"...
lexical_declaration
let "let"
variable_declarator
identifier "a"
= "="
call_expression
member_expression
member_expression
identifier "p"
. "."
property_identifier "a"
. "."
property_identifier "toFixed"
arguments
( "("
) ")"
; ";"
lexical_declaration
let "let"
variable_declarator
identifier "b"
= "="
call_expression
member_expression
member_expression
identifier "p"
. "."
property_identifier "b"
. "."
property_identifier "substring"
arguments
( "("
number "1"
) ")"
; ";"
comment "// Should error even though 'd' is in 'Keys'"
lexical_declaration
let "let"
variable_declarator
identifier "d"
= "="
member_expression
identifier "p"
. "."
property_identifier "d"
; ";"
comment "//// [typeSatisfaction_propNameConstraining.js]"
expression_statement
string
" "\""
string_fragment "use strict"
" "\""
; ";"
lexical_declaration (+27 nodes collapsed)
comment "// Should be OK -- retain info that a is number and b is str"...
lexical_declaration
let "let"
variable_declarator
identifier "a"
= "="
call_expression
member_expression
member_expression
identifier "p"
. "."
property_identifier "a"
. "."
property_identifier "toFixed"
arguments
( "("
) ")"
; ";"
lexical_declaration
let "let"
variable_declarator
identifier "b"
= "="
call_expression
member_expression
member_expression
identifier "p"
. "."
property_identifier "b"
. "."
property_identifier "substring"
arguments
( "("
number "1"
) ")"
; ";"
comment "// Should error even though 'd' is in 'Keys'"
lexical_declaration
let "let"
variable_declarator
identifier "d"
= "="
member_expression
identifier "p"
. "."
property_identifier "d"
; ";"