Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve comparison operators type checking to disallow unions containing numbers as an operand #52048

Merged

Conversation

Andarist
Copy link
Contributor

fixes #52036

at this moment this is just a spike to check if this is even a desired change

@typescript-bot typescript-bot added the For Uncommitted Bug PR for untriaged, rejected, closed or missing bug label Dec 29, 2022
Comment on lines +35646 to +35647
return leftAssignableToNumber && rightAssignableToNumber ||
!leftAssignableToNumber && !rightAssignableToNumber && areTypesComparable(left, right);
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

essentially, when one of the operands is assignable to a number (or big int) then we require the other one to be assignable to it too. areTypesComparable kicks in only when both sides are not assignable to numberOrBigIntType

@@ -6,9 +6,41 @@ tests/cases/conformance/expressions/binaryOperators/comparisonOperator/compariso
tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithNoRelationshipTypeParameter.ts(17,14): error TS2367: This comparison appears to be unintentional because the types 'T' and 'U' have no overlap.
tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithNoRelationshipTypeParameter.ts(18,14): error TS2367: This comparison appears to be unintentional because the types 'T' and 'U' have no overlap.
tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithNoRelationshipTypeParameter.ts(19,14): error TS2367: This comparison appears to be unintentional because the types 'T' and 'U' have no overlap.
tests/cases/conformance/expressions/binaryOperators/comparisonOperator/comparisonOperatorWithNoRelationshipTypeParameter.ts(23,16): error TS2365: Operator '<' cannot be applied to types 'T' and 'number'.
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To bring back the old behavior we should probably also allow unconstrained generics - but I wasn't sure what's the best check for them. Should I just check someType with a predicate testing if the type is a TypeParameter without a constraint?

@@ -0,0 +1,113 @@
tests/cases/conformance/controlFlow/controlFlowWhileStatement.ts(81,12): error TS2365: Operator '>' cannot be applied to types 'string | number' and 'number'.
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps this indicated that the improvement requires some more work - or maybe that it's not a good improvement after all, as maybe "swallowing" non-numbers in unions is desired? Kinda easy to miss a mistake because of this behavior but some existing code can depend on it

Comment on lines +84 to +87
x = "";
while (x > 1) {
~~~~~
!!! error TS2365: Operator '>' cannot be applied to types 'string | number' and 'number'.
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I feel like perhaps the error here is actually desirable - since the initial CFA type is string and for such this while loop is ignored at runtime (and could be ignored by the CFA analysis). We never enter the body of this loop

@RyanCavanaugh
Copy link
Member

@typescript-bot test this
@typescript-bot test top100
@typescript-bot user test this
@typescript-bot user test tsserver
@typescript-bot test tsserver top100
@typescript-bot run dt
@typescript-bot perf test this

@typescript-bot
Copy link
Collaborator

typescript-bot commented Jan 4, 2023

Heya @RyanCavanaugh, I've started to run the perf test suite on this PR at 7996bcb. You can monitor the build here.

Update: The results are in!

@typescript-bot
Copy link
Collaborator

typescript-bot commented Jan 4, 2023

Heya @RyanCavanaugh, I've started to run the diff-based top-repos suite (tsserver) on this PR at 7996bcb. You can monitor the build here.

Update: The results are in!

@typescript-bot
Copy link
Collaborator

typescript-bot commented Jan 4, 2023

Heya @RyanCavanaugh, I've started to run the parallelized Definitely Typed test suite on this PR at 7996bcb. You can monitor the build here.

@typescript-bot
Copy link
Collaborator

typescript-bot commented Jan 4, 2023

Heya @RyanCavanaugh, I've started to run the extended test suite on this PR at 7996bcb. You can monitor the build here.

@typescript-bot
Copy link
Collaborator

typescript-bot commented Jan 4, 2023

Heya @RyanCavanaugh, I've started to run the diff-based top-repos suite on this PR at 7996bcb. You can monitor the build here.

Update: The results are in!

@typescript-bot
Copy link
Collaborator

typescript-bot commented Jan 4, 2023

Heya @RyanCavanaugh, I've started to run the diff-based user code test suite on this PR at 7996bcb. You can monitor the build here.

Update: The results are in!

@typescript-bot
Copy link
Collaborator

typescript-bot commented Jan 4, 2023

Heya @RyanCavanaugh, I've started to run the diff-based user code test suite (tsserver) on this PR at 7996bcb. You can monitor the build here.

Update: The results are in!

@typescript-bot
Copy link
Collaborator

@RyanCavanaugh Here are the results of running the user test suite comparing main and refs/pull/52048/merge:

Everything looks good!

@typescript-bot
Copy link
Collaborator

@RyanCavanaugh Here are the results of running the user test suite comparing main and refs/pull/52048/merge:

Something interesting changed - please have a look.

Details

webpack

tsconfig.json

tsconfig.types.json

@typescript-bot
Copy link
Collaborator

Heya @RyanCavanaugh, I've run the RWC suite on this PR - assuming you're on the TS core team, you can view the resulting diff here.

@RyanCavanaugh
Copy link
Member

Breaks from an internal codebase (an ancient snapshot FWIW):

                animateOverlayPanel: (deltaY?: Number) => {
                    if (typeof(deltaY) !== 'undefined' && deltaY < 0 && !!this.state.currentItem.url) {
                                                          ~~~~~~~~~~
!!! error TS2365: Operator '<' cannot be applied to types 'Number' and 'number'.
        if (item && item.redacted && item.redacted > 0) {
                                            ~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2365: Operator '>' cannot be applied to types 'string | number' and 'number'.
                } else if (latin1ToGsm[codePoint] < -1) {
                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2365: Operator '<' cannot be applied to types 'string | number' and 'number'.
                    scalarGsmEncodedLength.push(2);
                } else {
                    urlPreviewInfo.content_type === FileTypeHelper.imageContentTypes.gif
                        && urlPreviewInfo.size
                        && urlPreviewInfo.size > this._maxGifFileSizeForIOs;
                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2365: Operator '>' cannot be applied to types 'string | number' and 'number'.

@Andarist
Copy link
Contributor Author

Andarist commented Jan 4, 2023

Most of the breaks here look very desirable to me. The Number vs number one should probably be corrected though.

@typescript-bot
Copy link
Collaborator

@RyanCavanaugh
The results of the perf run you requested are in!

Here they are:

Compiler

Comparison Report - main..52048
Metric main 52048 Delta Best Worst
Angular - node (v18.10.0, x64)
Memory used 372,498k (± 0.01%) 372,489k (± 0.01%) -9k (- 0.00%) 372,440k 372,562k
Parse Time 3.96s (± 0.81%) 3.98s (± 1.24%) +0.01s (+ 0.34%) 3.90s 4.03s
Bind Time 1.20s (± 0.73%) 1.19s (± 0.74%) -0.01s (- 0.42%) 1.18s 1.21s
Check Time 8.62s (± 0.75%) 8.61s (± 0.50%) -0.01s (- 0.08%) 8.58s 8.70s
Emit Time 7.55s (± 0.92%) 7.55s (± 0.75%) +0.00s (+ 0.04%) 7.48s 7.62s
Total Time 21.33s (± 0.59%) 21.33s (± 0.54%) +0.00s (+ 0.02%) 21.21s 21.48s
Compiler-Unions - node (v18.10.0, x64)
Memory used 199,110k (± 1.16%) 200,978k (± 1.54%) +1,869k (+ 0.94%) 198,088k 203,883k
Parse Time 1.65s (± 1.75%) 1.64s (± 1.55%) -0.01s (- 0.40%) 1.59s 1.67s
Bind Time 0.79s (± 0.72%) 0.79s (± 0.66%) -0.00s (- 0.31%) 0.78s 0.80s
Check Time 9.45s (± 0.66%) 9.37s (± 0.75%) -0.07s (- 0.78%) 9.26s 9.44s
Emit Time 2.75s (± 1.04%) 2.75s (± 0.72%) -0.00s (- 0.10%) 2.72s 2.77s
Total Time 14.64s (± 0.64%) 14.55s (± 0.55%) -0.09s (- 0.59%) 14.43s 14.64s
Monaco - node (v18.10.0, x64)
Memory used 353,963k (± 0.01%) 353,904k (± 0.01%) -59k (- 0.02%) 353,867k 353,946k
Parse Time 2.96s (± 1.34%) 2.94s (± 0.80%) -0.01s (- 0.47%) 2.92s 2.98s
Bind Time 1.04s (± 1.06%) 1.04s (± 1.47%) -0.00s (- 0.13%) 1.02s 1.06s
Check Time 7.24s (± 0.66%) 7.20s (± 0.34%) -0.04s (- 0.61%) 7.16s 7.23s
Emit Time 4.31s (± 0.98%) 4.25s (± 1.10%) -0.06s (- 1.44%) 4.20s 4.31s
Total Time 15.55s (± 0.70%) 15.43s (± 0.44%) -0.12s (- 0.75%) 15.37s 15.55s
TFS - node (v18.10.0, x64)
Memory used 309,869k (± 0.01%) 309,856k (± 0.00%) -14k (- 0.00%) 309,838k 309,873k
Parse Time 2.25s (± 0.76%) 2.26s (± 1.19%) +0.00s (+ 0.22%) 2.23s 2.31s
Bind Time 1.17s (± 0.88%) 1.15s (± 0.32%) -0.01s (- 1.00%) 1.15s 1.16s
Check Time 6.81s (± 0.75%) 6.81s (± 0.67%) -0.01s (- 0.10%) 6.75s 6.87s
Emit Time 3.94s (± 0.88%) 3.90s (± 0.50%) -0.03s (- 0.89%) 3.87s 3.92s
Total Time 14.17s (± 0.57%) 14.12s (± 0.55%) -0.05s (- 0.33%) 14.02s 14.23s
material-ui - node (v18.10.0, x64)
Memory used 485,044k (± 0.01%) 485,119k (± 0.01%) +74k (+ 0.02%) 485,067k 485,149k
Parse Time 3.52s (± 0.31%) 3.52s (± 0.46%) -0.00s (- 0.14%) 3.50s 3.55s
Bind Time 0.96s (± 0.55%) 0.96s (± 0.88%) +0.00s (+ 0.52%) 0.95s 0.98s
Check Time 16.96s (± 0.74%) 16.90s (± 0.99%) -0.06s (- 0.33%) 16.76s 17.23s
Emit Time 0.00s (± 0.00%) 0.00s (± 0.00%) 0.00s ( NaN%) 0.00s 0.00s
Total Time 21.44s (± 0.62%) 21.38s (± 0.80%) -0.06s (- 0.27%) 21.21s 21.71s
xstate - node (v18.10.0, x64)
Memory used 569,822k (± 0.02%) 569,793k (± 0.03%) -29k (- 0.01%) 569,602k 569,959k
Parse Time 4.41s (± 0.87%) 4.42s (± 0.77%) +0.00s (+ 0.06%) 4.38s 4.46s
Bind Time 1.70s (± 0.74%) 1.69s (± 0.75%) -0.01s (- 0.30%) 1.68s 1.71s
Check Time 2.59s (± 0.75%) 2.60s (± 0.59%) +0.01s (+ 0.25%) 2.57s 2.62s
Emit Time 0.08s (± 0.11%) 0.08s (± 0.11%) -0.00s (- 0.20%) 0.08s 0.08s
Total Time 8.79s (± 0.47%) 8.79s (± 0.45%) +0.01s (+ 0.07%) 8.75s 8.85s
Angular - node (v16.17.1, x64)
Memory used 371,802k (± 0.01%) 371,861k (± 0.01%) +59k (+ 0.02%) 371,830k 371,909k
Parse Time 4.14s (± 0.68%) 4.14s (± 0.24%) +0.00s (+ 0.08%) 4.13s 4.16s
Bind Time 1.27s (± 0.54%) 1.27s (± 0.79%) -0.01s (- 0.44%) 1.25s 1.28s
Check Time 9.28s (± 0.61%) 9.30s (± 0.39%) +0.02s (+ 0.21%) 9.27s 9.37s
Emit Time 7.96s (± 0.17%) 7.97s (± 0.74%) +0.01s (+ 0.15%) 7.90s 8.05s
Total Time 22.66s (± 0.34%) 22.68s (± 0.46%) +0.03s (+ 0.12%) 22.54s 22.80s
Compiler-Unions - node (v16.17.1, x64)
Memory used 200,839k (± 0.92%) 199,826k (± 0.08%) -1,013k (- 0.50%) 199,500k 199,933k
Parse Time 1.82s (± 0.51%) 1.82s (± 0.41%) -0.00s (- 0.23%) 1.81s 1.83s
Bind Time 0.84s (± 1.00%) 0.84s (± 0.79%) -0.01s (- 0.82%) 0.83s 0.85s
Check Time 10.11s (± 0.83%) 10.10s (± 1.29%) -0.01s (- 0.12%) 9.94s 10.28s
Emit Time 3.14s (± 6.00%) 3.04s (± 4.32%) 🟩-0.10s (- 3.09%) 2.96s 3.29s
Total Time 15.92s (± 1.43%) 15.80s (± 1.46%) -0.12s (- 0.73%) 15.56s 16.24s
Monaco - node (v16.17.1, x64)
Memory used 353,248k (± 0.01%) 353,231k (± 0.01%) -18k (- 0.00%) 353,199k 353,267k
Parse Time 3.19s (± 1.20%) 3.17s (± 0.53%) -0.02s (- 0.55%) 3.15s 3.19s
Bind Time 1.11s (± 1.22%) 1.11s (± 1.33%) +0.00s (+ 0.02%) 1.09s 1.14s
Check Time 7.85s (± 0.36%) 7.85s (± 0.38%) +0.00s (+ 0.06%) 7.82s 7.90s
Emit Time 4.48s (± 0.48%) 4.48s (± 0.40%) -0.00s (- 0.10%) 4.45s 4.50s
Total Time 16.63s (± 0.36%) 16.62s (± 0.37%) -0.02s (- 0.10%) 16.54s 16.72s
TFS - node (v16.17.1, x64)
Memory used 309,212k (± 0.01%) 309,216k (± 0.00%) +4k (+ 0.00%) 309,210k 309,225k
Parse Time 2.62s (± 1.14%) 2.61s (± 0.95%) -0.01s (- 0.30%) 2.58s 2.65s
Bind Time 1.07s (± 1.43%) 1.04s (± 0.72%) -0.03s (- 2.53%) 1.04s 1.06s
Check Time 7.42s (± 0.49%) 7.38s (± 0.29%) -0.04s (- 0.52%) 7.36s 7.41s
Emit Time 4.24s (± 0.58%) 4.20s (± 0.79%) -0.04s (- 0.87%) 4.15s 4.24s
Total Time 15.34s (± 0.39%) 15.23s (± 0.35%) -0.11s (- 0.74%) 15.16s 15.30s
material-ui - node (v16.17.1, x64)
Memory used 484,374k (± 0.00%) 484,398k (± 0.01%) +24k (+ 0.00%) 484,358k 484,429k
Parse Time 3.68s (± 0.39%) 3.67s (± 0.29%) -0.01s (- 0.20%) 3.66s 3.68s
Bind Time 1.02s (± 0.71%) 1.01s (± 0.64%) -0.00s (- 0.26%) 1.00s 1.02s
Check Time 17.86s (± 0.59%) 17.89s (± 0.51%) +0.03s (+ 0.15%) 17.79s 18.00s
Emit Time 0.00s (± 0.00%) 0.00s (± 0.00%) 0.00s ( NaN%) 0.00s 0.00s
Total Time 22.56s (± 0.45%) 22.57s (± 0.45%) +0.01s (+ 0.04%) 22.46s 22.70s
xstate - node (v16.17.1, x64)
Memory used 567,338k (± 0.02%) 567,334k (± 0.01%) -4k (- 0.00%) 567,274k 567,429k
Parse Time 4.77s (± 0.73%) 4.75s (± 0.43%) -0.01s (- 0.31%) 4.74s 4.79s
Bind Time 1.66s (± 0.66%) 1.65s (± 0.74%) -0.01s (- 0.64%) 1.62s 1.66s
Check Time 2.83s (± 0.57%) 2.83s (± 0.43%) -0.00s (- 0.03%) 2.81s 2.84s
Emit Time 0.09s (± 4.66%) 0.09s (± 4.56%) -0.00s (- 0.04%) 0.08s 0.09s
Total Time 9.34s (± 0.37%) 9.32s (± 0.37%) -0.02s (- 0.25%) 9.27s 9.37s
Angular - node (v14.15.1, x64)
Memory used 365,502k (± 0.00%) 365,498k (± 0.00%) -4k (- 0.00%) 365,479k 365,521k
Parse Time 4.16s (± 0.79%) 4.15s (± 0.40%) -0.01s (- 0.18%) 4.12s 4.17s
Bind Time 1.30s (± 0.49%) 1.30s (± 0.30%) +0.00s (+ 0.23%) 1.30s 1.31s
Check Time 9.66s (± 0.34%) 9.70s (± 0.46%) +0.04s (+ 0.41%) 9.64s 9.78s
Emit Time 8.21s (± 0.83%) 8.19s (± 0.60%) -0.02s (- 0.25%) 8.10s 8.25s
Total Time 23.32s (± 0.33%) 23.33s (± 0.25%) +0.01s (+ 0.06%) 23.24s 23.40s
Compiler-Unions - node (v14.15.1, x64)
Memory used 194,956k (± 0.01%) 195,016k (± 0.03%) +60k (+ 0.03%) 194,954k 195,085k
Parse Time 1.86s (± 0.21%) 1.84s (± 0.62%) -0.01s (- 0.75%) 1.83s 1.86s
Bind Time 0.87s (± 0.56%) 0.87s (± 0.89%) -0.00s (- 0.41%) 0.87s 0.89s
Check Time 10.14s (± 0.48%) 10.09s (± 0.54%) -0.05s (- 0.46%) 10.01s 10.14s
Emit Time 3.12s (± 0.96%) 3.13s (± 0.40%) +0.00s (+ 0.13%) 3.11s 3.14s
Total Time 15.99s (± 0.38%) 15.94s (± 0.41%) -0.05s (- 0.32%) 15.85s 16.00s
Monaco - node (v14.15.1, x64)
Memory used 348,122k (± 0.01%) 348,076k (± 0.01%) -46k (- 0.01%) 348,050k 348,116k
Parse Time 3.26s (± 1.01%) 3.24s (± 0.89%) -0.02s (- 0.65%) 3.21s 3.28s
Bind Time 1.13s (± 0.57%) 1.12s (± 0.94%) -0.01s (- 0.62%) 1.11s 1.14s
Check Time 8.13s (± 0.46%) 8.15s (± 0.39%) +0.02s (+ 0.29%) 8.12s 8.21s
Emit Time 4.70s (± 0.46%) 4.71s (± 0.83%) +0.02s (+ 0.32%) 4.67s 4.78s
Total Time 17.21s (± 0.41%) 17.22s (± 0.38%) +0.01s (+ 0.07%) 17.13s 17.32s
TFS - node (v14.15.1, x64)
Memory used 304,140k (± 0.00%) 304,140k (± 0.00%) 0k ( 0.00%) 304,121k 304,152k
Parse Time 2.73s (± 0.83%) 2.71s (± 0.93%) -0.03s (- 0.95%) 2.67s 2.75s
Bind Time 1.09s (± 0.60%) 1.07s (± 0.48%) -0.01s (- 1.23%) 1.06s 1.08s
Check Time 7.70s (± 0.38%) 7.75s (± 0.35%) +0.05s (+ 0.65%) 7.73s 7.80s
Emit Time 4.60s (± 1.00%) 4.56s (± 1.36%) -0.05s (- 1.00%) 4.50s 4.66s
Total Time 16.13s (± 0.45%) 16.09s (± 0.63%) -0.04s (- 0.23%) 16.01s 16.28s
material-ui - node (v14.15.1, x64)
Memory used 479,809k (± 0.00%) 479,786k (± 0.00%) -23k (- 0.00%) 479,771k 479,806k
Parse Time 3.91s (± 0.44%) 3.88s (± 0.52%) -0.02s (- 0.59%) 3.86s 3.91s
Bind Time 1.05s (± 0.68%) 1.05s (± 0.61%) -0.00s (- 0.32%) 1.04s 1.06s
Check Time 18.99s (± 0.56%) 18.93s (± 0.54%) -0.05s (- 0.29%) 18.78s 19.08s
Emit Time 0.00s (± 0.00%) 0.00s (± 0.00%) 0.00s ( NaN%) 0.00s 0.00s
Total Time 23.95s (± 0.45%) 23.87s (± 0.40%) -0.08s (- 0.34%) 23.71s 23.99s
xstate - node (v14.15.1, x64)
Memory used 555,710k (± 0.01%) 555,695k (± 0.01%) -15k (- 0.00%) 555,652k 555,731k
Parse Time 5.12s (± 0.70%) 5.11s (± 0.98%) -0.02s (- 0.30%) 5.06s 5.19s
Bind Time 1.60s (± 1.36%) 1.57s (± 0.54%) -0.02s (- 1.45%) 1.56s 1.59s
Check Time 2.99s (± 0.44%) 2.97s (± 0.56%) -0.02s (- 0.71%) 2.95s 2.99s
Emit Time 0.10s (± 0.16%) 0.10s (± 0.23%) -0.00s (- 0.10%) 0.10s 0.10s
Total Time 9.81s (± 0.64%) 9.76s (± 0.56%) -0.06s (- 0.57%) 9.70s 9.84s
System
Machine Namets-ci-ubuntu
Platformlinux 5.4.0-135-generic
Architecturex64
Available Memory16 GB
Available Memory15 GB
CPUs4 × Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz
Hosts
  • node (v18.10.0, x64)
  • node (v16.17.1, x64)
  • node (v14.15.1, x64)
Scenarios
  • Angular - node (v18.10.0, x64)
  • Angular - node (v16.17.1, x64)
  • Angular - node (v14.15.1, x64)
  • Compiler-Unions - node (v18.10.0, x64)
  • Compiler-Unions - node (v16.17.1, x64)
  • Compiler-Unions - node (v14.15.1, x64)
  • Monaco - node (v18.10.0, x64)
  • Monaco - node (v16.17.1, x64)
  • Monaco - node (v14.15.1, x64)
  • TFS - node (v18.10.0, x64)
  • TFS - node (v16.17.1, x64)
  • TFS - node (v14.15.1, x64)
  • material-ui - node (v18.10.0, x64)
  • material-ui - node (v16.17.1, x64)
  • material-ui - node (v14.15.1, x64)
  • xstate - node (v18.10.0, x64)
  • xstate - node (v16.17.1, x64)
  • xstate - node (v14.15.1, x64)
Benchmark Name Iterations
Current 52048 6
Baseline main 6

TSServer

Comparison Report - main..52048
Metric main 52048 Delta Best Worst
Compiler-UnionsTSServer - node (v18.10.0, x64)
Req 1 - updateOpen 2,537ms (± 1.73%) 2,554ms (± 1.30%) +16ms (+ 0.64%) 2,508ms 2,603ms
Req 2 - geterr 5,646ms (± 1.20%) 5,650ms (± 1.02%) +4ms (+ 0.06%) 5,578ms 5,710ms
Req 3 - references 362ms (± 2.69%) 362ms (± 2.13%) +0ms (+ 0.04%) 353ms 376ms
Req 4 - navto 291ms (± 1.50%) 292ms (± 2.23%) +2ms (+ 0.62%) 284ms 302ms
Req 5 - completionInfo count 1,356 (± 0.00%) 1,356 (± 0.00%) 0 ( 0.00%) 1,356 1,356
Req 5 - completionInfo 84ms (± 5.43%) 80ms (± 8.09%) 🟩-4ms (- 5.14%) 71ms 87ms
CompilerTSServer - node (v18.10.0, x64)
Req 1 - updateOpen 2,696ms (± 1.05%) 2,713ms (± 1.60%) +17ms (+ 0.62%) 2,675ms 2,774ms
Req 2 - geterr 4,131ms (± 0.18%) 4,137ms (± 0.98%) +6ms (+ 0.14%) 4,096ms 4,191ms
Req 3 - references 357ms (± 0.76%) 357ms (± 0.75%) -1ms (- 0.21%) 352ms 360ms
Req 4 - navto 290ms (± 0.74%) 291ms (± 1.10%) +1ms (+ 0.21%) 289ms 297ms
Req 5 - completionInfo count 1,518 (± 0.00%) 1,518 (± 0.00%) 0 ( 0.00%) 1,518 1,518
Req 5 - completionInfo 65ms (± 1.36%) 65ms (± 1.22%) +0ms (+ 0.43%) 64ms 66ms
xstateTSServer - node (v18.10.0, x64)
Req 1 - updateOpen 3,625ms (± 0.71%) 3,598ms (± 0.60%) -26ms (- 0.73%) 3,562ms 3,620ms
Req 2 - geterr 1,331ms (± 1.32%) 1,336ms (± 1.20%) +5ms (+ 0.34%) 1,318ms 1,356ms
Req 3 - references 104ms (± 3.33%) 105ms (± 2.37%) +1ms (+ 1.17%) 103ms 110ms
Req 4 - navto 360ms (± 1.93%) 357ms (± 1.92%) -3ms (- 0.88%) 349ms 368ms
Req 5 - completionInfo count 3,154 (± 0.00%) 3,154 (± 0.00%) 0 ( 0.00%) 3,154 3,154
Req 5 - completionInfo 435ms (± 1.46%) 429ms (± 1.07%) -5ms (- 1.24%) 423ms 436ms
Compiler-UnionsTSServer - node (v16.17.1, x64)
Req 1 - updateOpen 2,792ms (± 0.59%) 2,542ms (±21.65%) 🟩-249ms (- 8.93%) 1,419ms 2,797ms
Req 2 - geterr 6,035ms (± 0.81%) 5,508ms (±21.97%) 🟩-526ms (- 8.72%) 3,037ms 6,070ms
Req 3 - references 363ms (± 1.11%) 335ms (±22.14%) 🟩-28ms (- 7.65%) 184ms 370ms
Req 4 - navto 280ms (± 0.35%) 256ms (±21.84%) 🟩-24ms (- 8.69%) 142ms 281ms
Req 5 - completionInfo count 1,356 (± 0.00%) 1,356 (± 0.00%) 0 ( 0.00%) 1,356 1,356
Req 5 - completionInfo 85ms (± 9.64%) 80ms (±21.27%) 🟩-5ms (- 6.17%) 48ms 95ms
CompilerTSServer - node (v16.17.1, x64)
Req 1 - updateOpen 2,910ms (± 0.73%) 2,899ms (± 0.47%) -11ms (- 0.37%) 2,876ms 2,915ms
Req 2 - geterr 4,494ms (± 0.27%) 4,493ms (± 0.38%) -0ms (- 0.01%) 4,474ms 4,520ms
Req 3 - references 383ms (± 1.06%) 383ms (± 0.32%) -0ms (- 0.04%) 381ms 384ms
Req 4 - navto 296ms (± 1.09%) 297ms (± 1.38%) +1ms (+ 0.45%) 292ms 304ms
Req 5 - completionInfo count 1,518 (± 0.00%) 1,518 (± 0.00%) 0 ( 0.00%) 1,518 1,518
Req 5 - completionInfo 74ms (± 3.97%) 72ms (± 3.01%) -2ms (- 2.74%) 70ms 76ms
xstateTSServer - node (v16.17.1, x64)
Req 1 - updateOpen 3,762ms (± 0.30%) 3,755ms (± 0.28%) -7ms (- 0.19%) 3,744ms 3,773ms
Req 2 - geterr 1,444ms (± 1.11%) 1,456ms (± 0.78%) +12ms (+ 0.82%) 1,444ms 1,472ms
Req 3 - references 108ms (± 1.00%) 109ms (± 3.15%) +1ms (+ 0.54%) 107ms 116ms
Req 4 - navto 352ms (± 0.70%) 346ms (± 1.14%) -6ms (- 1.63%) 341ms 351ms
Req 5 - completionInfo count 3,154 (± 0.00%) 3,154 (± 0.00%) 0 ( 0.00%) 3,154 3,154
Req 5 - completionInfo 455ms (± 1.93%) 454ms (± 0.51%) -2ms (- 0.37%) 450ms 456ms
Compiler-UnionsTSServer - node (v14.15.1, x64)
Req 1 - updateOpen 3,056ms (± 0.40%) 3,050ms (± 0.38%) -6ms (- 0.19%) 3,037ms 3,066ms
Req 2 - geterr 5,907ms (± 0.66%) 5,878ms (± 0.94%) -29ms (- 0.49%) 5,800ms 5,950ms
Req 3 - references 383ms (± 1.03%) 384ms (± 1.34%) +1ms (+ 0.38%) 375ms 389ms
Req 4 - navto 288ms (± 0.44%) 292ms (± 1.21%) +3ms (+ 1.18%) 286ms 296ms
Req 5 - completionInfo count 1,356 (± 0.00%) 1,356 (± 0.00%) 0 ( 0.00%) 1,356 1,356
Req 5 - completionInfo 82ms (± 1.20%) 80ms (± 3.17%) -2ms (- 2.78%) 77ms 85ms
CompilerTSServer - node (v14.15.1, x64)
Req 1 - updateOpen 3,199ms (± 1.02%) 3,205ms (± 0.59%) +5ms (+ 0.17%) 3,183ms 3,239ms
Req 2 - geterr 4,392ms (± 1.16%) 4,366ms (± 0.76%) -27ms (- 0.61%) 4,305ms 4,406ms
Req 3 - references 408ms (± 1.63%) 410ms (± 0.74%) +2ms (+ 0.47%) 408ms 414ms
Req 4 - navto 308ms (± 2.47%) 303ms (± 2.37%) -5ms (- 1.63%) 295ms 312ms
Req 5 - completionInfo count 1,518 (± 0.00%) 1,518 (± 0.00%) 0 ( 0.00%) 1,518 1,518
Req 5 - completionInfo 82ms (± 7.39%) 85ms (±10.35%) +3ms (+ 4.04%) 76ms 96ms
xstateTSServer - node (v14.15.1, x64)
Req 1 - updateOpen 3,783ms (± 0.50%) 3,788ms (± 0.80%) +5ms (+ 0.14%) 3,756ms 3,842ms
Req 2 - geterr 1,460ms (± 0.95%) 1,463ms (± 0.68%) +3ms (+ 0.20%) 1,452ms 1,476ms
Req 3 - references 132ms (± 2.26%) 131ms (± 2.49%) -1ms (- 1.01%) 128ms 134ms
Req 4 - navto 395ms (± 0.66%) 395ms (± 0.13%) -1ms (- 0.14%) 394ms 395ms
Req 5 - completionInfo count 3,154 (± 0.00%) 3,154 (± 0.00%) 0 ( 0.00%) 3,154 3,154
Req 5 - completionInfo 498ms (± 1.34%) 496ms (± 1.47%) -2ms (- 0.42%) 486ms 502ms
System
Machine Namets-ci-ubuntu
Platformlinux 5.4.0-135-generic
Architecturex64
Available Memory16 GB
Available Memory15 GB
CPUs4 × Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz
Hosts
  • node (v18.10.0, x64)
  • node (v16.17.1, x64)
  • node (v14.15.1, x64)
Scenarios
  • Compiler-UnionsTSServer - node (v18.10.0, x64)
  • Compiler-UnionsTSServer - node (v16.17.1, x64)
  • Compiler-UnionsTSServer - node (v14.15.1, x64)
  • CompilerTSServer - node (v18.10.0, x64)
  • CompilerTSServer - node (v16.17.1, x64)
  • CompilerTSServer - node (v14.15.1, x64)
  • xstateTSServer - node (v18.10.0, x64)
  • xstateTSServer - node (v16.17.1, x64)
  • xstateTSServer - node (v14.15.1, x64)
Benchmark Name Iterations
Current 52048 6
Baseline main 6

Startup

Comparison Report - main..52048
Metric main 52048 Delta Best Worst
tsc-startup - node (v16.17.1, x64)
Execution time 138.42ms (± 0.27%) 138.37ms (± 0.23%) -0.05ms (- 0.04%) 137.50ms 141.25ms
tsserver-startup - node (v16.17.1, x64)
Execution time 222.62ms (± 0.19%) 222.46ms (± 0.18%) -0.16ms (- 0.07%) 220.89ms 226.13ms
tsserverlibrary-startup - node (v16.17.1, x64)
Execution time 224.03ms (± 0.19%) 224.02ms (± 0.16%) -0.01ms (- 0.00%) 223.04ms 231.72ms
typescript-startup - node (v16.17.1, x64)
Execution time 207.69ms (± 0.20%) 207.37ms (± 0.18%) -0.32ms (- 0.15%) 205.72ms 210.62ms
System
Machine Namets-ci-ubuntu
Platformlinux 5.4.0-135-generic
Architecturex64
Available Memory16 GB
Available Memory15 GB
CPUs4 × Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz
Hosts
  • node (v16.17.1, x64)
Scenarios
  • tsc-startup - node (v16.17.1, x64)
  • tsserver-startup - node (v16.17.1, x64)
  • tsserverlibrary-startup - node (v16.17.1, x64)
  • typescript-startup - node (v16.17.1, x64)
Benchmark Name Iterations
Current 52048 6
Baseline main 6

Developer Information:

Download Benchmark

@typescript-bot
Copy link
Collaborator

@RyanCavanaugh Here are the results of running the top-repos suite comparing main and refs/pull/52048/merge:

Something interesting changed - please have a look.

Details

directus/directus

⚠️ Note that built also had errors ⚠️
Req #2133 - completionInfo
    at hasCovariantVoidArgument (/typescript-main/built/local/tsserver.js:60119:91)
    at relateVariances (/typescript-main/built/local/tsserver.js:59369:64)
    at structuredTypeRelatedToWorker (/typescript-main/built/local/tsserver.js:59038:32)
    at structuredTypeRelatedTo (/typescript-main/built/local/tsserver.js:58956:21)
    at recursiveTypeRelatedTo (/typescript-main/built/local/tsserver.js:58926:19)
    at isRelatedTo (/typescript-main/built/local/tsserver.js:58529:122)
    at eachTypeRelatedToType (/typescript-main/built/local/tsserver.js:58798:28)
    at unionOrIntersectionRelatedTo (/typescript-main/built/local/tsserver.js:58697:171)
    at structuredTypeRelatedToWorker (/typescript-main/built/local/tsserver.js:59026:23)
    at structuredTypeRelatedTo (/typescript-main/built/local/tsserver.js:58956:21)
    at recursiveTypeRelatedTo (/typescript-main/built/local/tsserver.js:58926:19)
    at isRelatedTo (/typescript-main/built/local/tsserver.js:58529:122)
    at isPropertySymbolTypeRelated (/typescript-main/built/local/tsserver.js:59479:14)
    at propertyRelatedTo (/typescript-main/built/local/tsserver.js:59526:23)
    at propertiesRelatedTo (/typescript-main/built/local/tsserver.js:59712:29)
    at structuredTypeRelatedToWorker (/typescript-main/built/local/tsserver.js:59328:21)
    at structuredTypeRelatedTo (/typescript-main/built/local/tsserver.js:58956:21)
    at recursiveTypeRelatedTo (/typescript-main/built/local/tsserver.js:58926:19)
    at isRelatedTo (/typescript-main/built/local/tsserver.js:58529:122)
    at checkTypeRelatedTo (/typescript-main/built/local/tsserver.js:58219:20)
    at isTypeRelatedTo (/typescript-main/built/local/tsserver.js:58174:14)
    at isTypeAssignableTo (/typescript-main/built/local/tsserver.js:57525:12)
    at getVariancesWorker (/typescript-main/built/local/tsserver.js:60079:23)
    at getAliasVariances (/typescript-main/built/local/tsserver.js:60060:12)
    at structuredTypeRelatedToWorker (/typescript-main/built/local/tsserver.js:59034:27)
    at structuredTypeRelatedTo (/typescript-main/built/local/tsserver.js:58956:21)
    at recursiveTypeRelatedTo (/typescript-main/built/local/tsserver.js:58926:19)
    at isRelatedTo (/typescript-main/built/local/tsserver.js:58529:122)
    at indexInfoRelatedTo (/typescript-main/built/local/tsserver.js:59904:23)
    at typeRelatedToIndexInfo (/typescript-main/built/local/tsserver.js:59933:16)
    at indexSignaturesRelatedTo (/typescript-main/built/local/tsserver.js:59922:280)
    at structuredTypeRelatedToWorker (/typescript-main/built/local/tsserver.js:59334:28)
    at structuredTypeRelatedTo (/typescript-main/built/local/tsserver.js:58956:21)
    at recursiveTypeRelatedTo (/typescript-main/built/local/tsserver.js:58926:19)
    at isRelatedTo (/typescript-main/built/local/tsserver.js:58529:122)
    at checkTypeRelatedTo (/typescript-main/built/local/tsserver.js:58219:20)
    at isTypeRelatedTo (/typescript-main/built/local/tsserver.js:58174:14)
    at isTypeAssignableTo (/typescript-main/built/local/tsserver.js:57525:12)
    at getVariancesWorker (/typescript-main/built/local/tsserver.js:60079:23)
    at getAliasVariances (/typescript-main/built/local/tsserver.js:60060:12)
    at structuredTypeRelatedToWorker (/typescript-main/built/local/tsserver.js:59034:27)
    at structuredTypeRelatedTo (/typescript-main/built/local/tsserver.js:58956:21)
    at recursiveTypeRelatedTo (/typescript-main/built/local/tsserver.js:58926:19)
    at isRelatedTo (/typescript-main/built/local/tsserver.js:58529:122)
    at isPropertySymbolTypeRelated (/typescript-main/built/local/tsserver.js:59479:14)
    at propertyRelatedTo (/typescript-main/built/local/tsserver.js:59526:23)
    at propertiesRelatedTo (/typescript-main/built/local/tsserver.js:59712:29)
    at structuredTypeRelatedToWorker (/typescript-main/built/local/tsserver.js:59328:21)
    at structuredTypeRelatedTo (/typescript-main/built/local/tsserver.js:58956:21)
    at recursiveTypeRelatedTo (/typescript-main/built/local/tsserver.js:58926:19)
    at isRelatedTo (/typescript-main/built/local/tsserver.js:58529:122)
    at checkTypeRelatedTo (/typescript-main/built/local/tsserver.js:58219:20)
    at isTypeRelatedTo (/typescript-main/built/local/tsserver.js:58174:14)
    at isTypeAssignableTo (/typescript-main/built/local/tsserver.js:57525:12)
    at getVariancesWorker (/typescript-main/built/local/tsserver.js:60079:23)
    at getVariances (/typescript-main/built/local/tsserver.js:60057:128)
    at structuredTypeRelatedToWorker (/typescript-main/built/local/tsserver.js:59309:29)
    at structuredTypeRelatedTo (/typescript-main/built/local/tsserver.js:58956:21)
    at recursiveTypeRelatedTo (/typescript-main/built/local/tsserver.js:58926:19)
    at isRelatedTo (/typescript-main/built/local/tsserver.js:58529:122)
    at eachTypeRelatedToType (/typescript-main/built/local/tsserver.js:58798:28)
    at unionOrIntersectionRelatedTo (/typescript-main/built/local/tsserver.js:58697:171)
    at structuredTypeRelatedToWorker (/typescript-main/built/local/tsserver.js:59026:23)
    at structuredTypeRelatedTo (/typescript-main/built/local/tsserver.js:58956:21)
    at recursiveTypeRelatedTo (/typescript-main/built/local/tsserver.js:58926:19)
    at isRelatedTo (/typescript-main/built/local/tsserver.js:58529:122)
    at isRelatedToWorker (/typescript-main/built/local/tsserver.js:58463:14)
    at compareSignaturesRelated (/typescript-main/built/local/tsserver.js:57998:119)
    at signatureRelatedTo (/typescript-main/built/local/tsserver.js:59844:14)
    at signaturesRelatedTo (/typescript-main/built/local/tsserver.js:59776:27)
    at structuredTypeRelatedToWorker (/typescript-main/built/local/tsserver.js:59330:24)
    at structuredTypeRelatedTo (/typescript-main/built/local/tsserver.js:58956:21)
    at recursiveTypeRelatedTo (/typescript-main/built/local/tsserver.js:58926:19)
    at isRelatedTo (/typescript-main/built/local/tsserver.js:58529:122)
    at isPropertySymbolTypeRelated (/typescript-main/built/local/tsserver.js:59479:14)
    at propertyRelatedTo (/typescript-main/built/local/tsserver.js:59526:23)
    at propertiesRelatedTo (/typescript-main/built/local/tsserver.js:59712:29)
    at structuredTypeRelatedToWorker (/typescript-main/built/local/tsserver.js:59328:21)
    at structuredTypeRelatedTo (/typescript-main/built/local/tsserver.js:58956:21)
    at recursiveTypeRelatedTo (/typescript-main/built/local/tsserver.js:58926:19)
    at isRelatedTo (/typescript-main/built/local/tsserver.js:58529:122)
    at eachTypeRelatedToType (/typescript-main/built/local/tsserver.js:58798:28)
    at unionOrIntersectionRelatedTo (/typescript-main/built/local/tsserver.js:58697:171)
    at structuredTypeRelatedToWorker (/typescript-main/built/local/tsserver.js:59026:23)
    at structuredTypeRelatedTo (/typescript-main/built/local/tsserver.js:58956:21)
    at recursiveTypeRelatedTo (/typescript-main/built/local/tsserver.js:58926:19)
    at isRelatedTo (/typescript-main/built/local/tsserver.js:58529:122)
    at isRelatedToWorker (/typescript-main/built/local/tsserver.js:58463:14)
    at compareSignaturesRelated (/typescript-main/built/local/tsserver.js:57998:119)
    at signatureRelatedTo (/typescript-main/built/local/tsserver.js:59844:14)
    at signaturesRelatedTo (/typescript-main/built/local/tsserver.js:59776:27)
    at structuredTypeRelatedToWorker (/typescript-main/built/local/tsserver.js:59330:24)
    at structuredTypeRelatedTo (/typescript-main/built/local/tsserver.js:58956:21)
    at recursiveTypeRelatedTo (/typescript-main/built/local/tsserver.js:58926:19)
    at isRelatedTo (/typescript-main/built/local/tsserver.js:58529:122)
    at isPropertySymbolTypeRelated (/typescript-main/built/local/tsserver.js:59479:14)
    at propertyRelatedTo (/typescript-main/built/local/tsserver.js:59526:23)
    at propertiesRelatedTo (/typescript-main/built/local/tsserver.js:59712:29)
    at structuredTypeRelatedToWorker (/typescript-main/built/local/tsserver.js:59328:21)
    at structuredTypeRelatedTo (/typescript-main/built/local/tsserver.js:58956:21)
Req #2133 - completionInfo
    at hasCovariantVoidArgument (/typescript-52048/built/local/tsserver.js:60119:91)
    at relateVariances (/typescript-52048/built/local/tsserver.js:59369:64)
    at structuredTypeRelatedToWorker (/typescript-52048/built/local/tsserver.js:59038:32)
    at structuredTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58956:21)
    at recursiveTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58926:19)
    at isRelatedTo (/typescript-52048/built/local/tsserver.js:58529:122)
    at eachTypeRelatedToType (/typescript-52048/built/local/tsserver.js:58798:28)
    at unionOrIntersectionRelatedTo (/typescript-52048/built/local/tsserver.js:58697:171)
    at structuredTypeRelatedToWorker (/typescript-52048/built/local/tsserver.js:59026:23)
    at structuredTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58956:21)
    at recursiveTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58926:19)
    at isRelatedTo (/typescript-52048/built/local/tsserver.js:58529:122)
    at isPropertySymbolTypeRelated (/typescript-52048/built/local/tsserver.js:59479:14)
    at propertyRelatedTo (/typescript-52048/built/local/tsserver.js:59526:23)
    at propertiesRelatedTo (/typescript-52048/built/local/tsserver.js:59712:29)
    at structuredTypeRelatedToWorker (/typescript-52048/built/local/tsserver.js:59328:21)
    at structuredTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58956:21)
    at recursiveTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58926:19)
    at isRelatedTo (/typescript-52048/built/local/tsserver.js:58529:122)
    at checkTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58219:20)
    at isTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58174:14)
    at isTypeAssignableTo (/typescript-52048/built/local/tsserver.js:57525:12)
    at getVariancesWorker (/typescript-52048/built/local/tsserver.js:60079:23)
    at getAliasVariances (/typescript-52048/built/local/tsserver.js:60060:12)
    at structuredTypeRelatedToWorker (/typescript-52048/built/local/tsserver.js:59034:27)
    at structuredTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58956:21)
    at recursiveTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58926:19)
    at isRelatedTo (/typescript-52048/built/local/tsserver.js:58529:122)
    at indexInfoRelatedTo (/typescript-52048/built/local/tsserver.js:59904:23)
    at typeRelatedToIndexInfo (/typescript-52048/built/local/tsserver.js:59933:16)
    at indexSignaturesRelatedTo (/typescript-52048/built/local/tsserver.js:59922:280)
    at structuredTypeRelatedToWorker (/typescript-52048/built/local/tsserver.js:59334:28)
    at structuredTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58956:21)
    at recursiveTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58926:19)
    at isRelatedTo (/typescript-52048/built/local/tsserver.js:58529:122)
    at checkTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58219:20)
    at isTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58174:14)
    at isTypeAssignableTo (/typescript-52048/built/local/tsserver.js:57525:12)
    at getVariancesWorker (/typescript-52048/built/local/tsserver.js:60079:23)
    at getAliasVariances (/typescript-52048/built/local/tsserver.js:60060:12)
    at structuredTypeRelatedToWorker (/typescript-52048/built/local/tsserver.js:59034:27)
    at structuredTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58956:21)
    at recursiveTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58926:19)
    at isRelatedTo (/typescript-52048/built/local/tsserver.js:58529:122)
    at isPropertySymbolTypeRelated (/typescript-52048/built/local/tsserver.js:59479:14)
    at propertyRelatedTo (/typescript-52048/built/local/tsserver.js:59526:23)
    at propertiesRelatedTo (/typescript-52048/built/local/tsserver.js:59712:29)
    at structuredTypeRelatedToWorker (/typescript-52048/built/local/tsserver.js:59328:21)
    at structuredTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58956:21)
    at recursiveTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58926:19)
    at isRelatedTo (/typescript-52048/built/local/tsserver.js:58529:122)
    at checkTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58219:20)
    at isTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58174:14)
    at isTypeAssignableTo (/typescript-52048/built/local/tsserver.js:57525:12)
    at getVariancesWorker (/typescript-52048/built/local/tsserver.js:60079:23)
    at getVariances (/typescript-52048/built/local/tsserver.js:60057:128)
    at structuredTypeRelatedToWorker (/typescript-52048/built/local/tsserver.js:59309:29)
    at structuredTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58956:21)
    at recursiveTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58926:19)
    at isRelatedTo (/typescript-52048/built/local/tsserver.js:58529:122)
    at eachTypeRelatedToType (/typescript-52048/built/local/tsserver.js:58798:28)
    at unionOrIntersectionRelatedTo (/typescript-52048/built/local/tsserver.js:58697:171)
    at structuredTypeRelatedToWorker (/typescript-52048/built/local/tsserver.js:59026:23)
    at structuredTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58956:21)
    at recursiveTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58926:19)
    at isRelatedTo (/typescript-52048/built/local/tsserver.js:58529:122)
    at isRelatedToWorker (/typescript-52048/built/local/tsserver.js:58463:14)
    at compareSignaturesRelated (/typescript-52048/built/local/tsserver.js:57998:119)
    at signatureRelatedTo (/typescript-52048/built/local/tsserver.js:59844:14)
    at signaturesRelatedTo (/typescript-52048/built/local/tsserver.js:59776:27)
    at structuredTypeRelatedToWorker (/typescript-52048/built/local/tsserver.js:59330:24)
    at structuredTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58956:21)
    at recursiveTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58926:19)
    at isRelatedTo (/typescript-52048/built/local/tsserver.js:58529:122)
    at isPropertySymbolTypeRelated (/typescript-52048/built/local/tsserver.js:59479:14)
    at propertyRelatedTo (/typescript-52048/built/local/tsserver.js:59526:23)
    at propertiesRelatedTo (/typescript-52048/built/local/tsserver.js:59712:29)
    at structuredTypeRelatedToWorker (/typescript-52048/built/local/tsserver.js:59328:21)
    at structuredTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58956:21)
    at recursiveTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58926:19)
    at isRelatedTo (/typescript-52048/built/local/tsserver.js:58529:122)
    at eachTypeRelatedToType (/typescript-52048/built/local/tsserver.js:58798:28)
    at unionOrIntersectionRelatedTo (/typescript-52048/built/local/tsserver.js:58697:171)
    at structuredTypeRelatedToWorker (/typescript-52048/built/local/tsserver.js:59026:23)
    at structuredTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58956:21)
    at recursiveTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58926:19)
    at isRelatedTo (/typescript-52048/built/local/tsserver.js:58529:122)
    at isRelatedToWorker (/typescript-52048/built/local/tsserver.js:58463:14)
    at compareSignaturesRelated (/typescript-52048/built/local/tsserver.js:57998:119)
    at signatureRelatedTo (/typescript-52048/built/local/tsserver.js:59844:14)
    at signaturesRelatedTo (/typescript-52048/built/local/tsserver.js:59776:27)
    at structuredTypeRelatedToWorker (/typescript-52048/built/local/tsserver.js:59330:24)
    at structuredTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58956:21)
    at recursiveTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58926:19)
    at isRelatedTo (/typescript-52048/built/local/tsserver.js:58529:122)
    at isPropertySymbolTypeRelated (/typescript-52048/built/local/tsserver.js:59479:14)
    at propertyRelatedTo (/typescript-52048/built/local/tsserver.js:59526:23)
    at propertiesRelatedTo (/typescript-52048/built/local/tsserver.js:59712:29)
    at structuredTypeRelatedToWorker (/typescript-52048/built/local/tsserver.js:59328:21)
    at structuredTypeRelatedTo (/typescript-52048/built/local/tsserver.js:58956:21)

That is a filtered view of the text. To see the raw error text, go to RepoResults4/directus.directus.rawError.txt in the artifact folder

Last few requests

{"seq":2130,"type":"request","command":"completionInfo","arguments":{"file":"@PROJECT_ROOT@/api/src/services/graphql/index.ts","line":338,"offset":21,"includeExternalModuleExports":false,"includeInsertTextCompletions":true,"triggerKind":1}}
{"seq":2131,"type":"request","command":"completionInfo","arguments":{"file":"@PROJECT_ROOT@/api/src/services/graphql/index.ts","line":367,"offset":1,"includeExternalModuleExports":false,"includeInsertTextCompletions":true,"triggerKind":1}}
{"seq":2132,"type":"request","command":"completionEntryDetails","arguments":{"file":"@PROJECT_ROOT@/api/src/services/graphql/index.ts","line":367,"offset":1,"entryNames":["_convertObjectType"]}}
{"seq":2133,"type":"request","command":"completionInfo","arguments":{"file":"@PROJECT_ROOT@/api/src/services/graphql/index.ts","line":386,"offset":60,"includeExternalModuleExports":false,"includeInsertTextCompletions":true,"triggerKind":1}}

Repro Steps

  1. git clone https://github.com/directus/directus --recurse-submodules
  2. In dir directus, run git reset --hard cbd2af050b0fe68b8d9a395da469597aec2b41a9
  3. In dir directus, run pnpm install --no-frozen-lockfile --prefer-offline --ignore-scripts --reporter=silent
  4. Back in the initial folder, download RepoResults4/directus.directus.replay.txt from the artifact folder
  5. npm install --no-save @typescript/server-replay
  6. npx tsreplay ./directus ./directus.directus.replay.txt path/to/tsserver.js
  7. npx tsreplay --help to learn about helpful switches for debugging, logging, etc

felixrieseberg/windows95

⚠️ Note that built also had errors ⚠️
Req #297 - references
    at formatMessage2 (/typescript-main/built/local/tsserver.js:159403:21)
    at IOSession.writeMessage (/typescript-main/built/local/tsserver.js:160410:21)
    at IOSession.send (/typescript-main/built/local/tsserver.js:160407:10)
    at IOSession.doOutput (/typescript-main/built/local/tsserver.js:160454:10)
    at IOSession.onMessage (/typescript-main/built/local/tsserver.js:162065:14)
    at Interface.<anonymous> (/typescript-main/built/local/tsserver.js:163451:14)
Req #297 - references
    at formatMessage2 (/typescript-52048/built/local/tsserver.js:159410:21)
    at IOSession.writeMessage (/typescript-52048/built/local/tsserver.js:160417:21)
    at IOSession.send (/typescript-52048/built/local/tsserver.js:160414:10)
    at IOSession.doOutput (/typescript-52048/built/local/tsserver.js:160461:10)
    at IOSession.onMessage (/typescript-52048/built/local/tsserver.js:162072:14)
    at Interface.<anonymous> (/typescript-52048/built/local/tsserver.js:163458:14)

That is a filtered view of the text. To see the raw error text, go to RepoResults4/felixrieseberg.windows95.rawError.txt in the artifact folder

Last few requests

{"seq":294,"type":"request","command":"completionInfo","arguments":{"file":"@PROJECT_ROOT@/src/renderer/lib/_libwabt.js","line":13,"offset":29694,"includeExternalModuleExports":false,"includeInsertTextCompletions":true,"triggerKind":1}}
{"seq":295,"type":"request","command":"completionEntryDetails","arguments":{"file":"@PROJECT_ROOT@/src/renderer/lib/_libwabt.js","line":13,"offset":29694,"entryNames":["_"]}}
{"seq":296,"type":"request","command":"definitionAndBoundSpan","arguments":{"file":"@PROJECT_ROOT@/src/renderer/lib/_libwabt.js","line":13,"offset":31046}}
{"seq":297,"type":"request","command":"references","arguments":{"file":"@PROJECT_ROOT@/src/renderer/lib/_libwabt.js","line":13,"offset":31059}}

Repro Steps

  1. git clone https://github.com/felixrieseberg/windows95 --recurse-submodules
  2. In dir windows95, run git reset --hard 17a81393467e2668eb2eea291ab4b6a749756dad
  3. In dir windows95, run yarn install --ignore-engines --ignore-scripts --silent
  4. Back in the initial folder, download RepoResults4/felixrieseberg.windows95.replay.txt from the artifact folder
  5. npm install --no-save @typescript/server-replay
  6. npx tsreplay ./windows95 ./felixrieseberg.windows95.replay.txt path/to/tsserver.js
  7. npx tsreplay --help to learn about helpful switches for debugging, logging, etc

palantir/blueprint

⚠️ Note that built also had errors ⚠️
Req #13114 - references
    at formatMessage2 (/typescript-main/built/local/tsserver.js:159403:21)
    at IOSession.writeMessage (/typescript-main/built/local/tsserver.js:160410:21)
    at IOSession.send (/typescript-main/built/local/tsserver.js:160407:10)
    at IOSession.doOutput (/typescript-main/built/local/tsserver.js:160454:10)
    at IOSession.onMessage (/typescript-main/built/local/tsserver.js:162065:14)
    at Interface.<anonymous> (/typescript-main/built/local/tsserver.js:163451:14)
Req #13114 - references
    at formatMessage2 (/typescript-52048/built/local/tsserver.js:159410:21)
    at IOSession.writeMessage (/typescript-52048/built/local/tsserver.js:160417:21)
    at IOSession.send (/typescript-52048/built/local/tsserver.js:160414:10)
    at IOSession.doOutput (/typescript-52048/built/local/tsserver.js:160461:10)
    at IOSession.onMessage (/typescript-52048/built/local/tsserver.js:162072:14)
    at Interface.<anonymous> (/typescript-52048/built/local/tsserver.js:163458:14)

That is a filtered view of the text. To see the raw error text, go to RepoResults4/palantir.blueprint.rawError.txt in the artifact folder

Last few requests

{"seq":13111,"type":"request","command":"completionEntryDetails","arguments":{"file":"@PROJECT_ROOT@/site/docs/versions/1/docs-app.js","line":1,"offset":586264,"entryNames":["_"]}}
{"seq":13112,"type":"request","command":"completionInfo","arguments":{"file":"@PROJECT_ROOT@/site/docs/versions/1/docs-app.js","line":1,"offset":586580,"includeExternalModuleExports":true,"includeInsertTextCompletions":true,"triggerKind":1}}
{"seq":13113,"type":"request","command":"completionInfo","arguments":{"file":"@PROJECT_ROOT@/site/docs/versions/1/docs-app.js","line":1,"offset":586609,"includeExternalModuleExports":false,"includeInsertTextCompletions":true,"triggerKind":1}}
{"seq":13114,"type":"request","command":"references","arguments":{"file":"@PROJECT_ROOT@/site/docs/versions/1/docs-app.js","line":1,"offset":587766}}

Repro Steps

  1. git clone https://github.com/palantir/blueprint --recurse-submodules
  2. In dir blueprint, run git reset --hard b8653656018f3a0d08a9fdadd5fd0e2813f9c158
  3. In dir blueprint, run yarn install --ignore-engines --ignore-scripts --silent
  4. Back in the initial folder, download RepoResults4/palantir.blueprint.replay.txt from the artifact folder
  5. npm install --no-save @typescript/server-replay
  6. npx tsreplay ./blueprint ./palantir.blueprint.replay.txt path/to/tsserver.js
  7. npx tsreplay --help to learn about helpful switches for debugging, logging, etc

vercel/hyper

⚠️ Note that built also had errors ⚠️
Req #12671 - references
    at formatMessage2 (/typescript-main/built/local/tsserver.js:159403:21)
    at IOSession.writeMessage (/typescript-main/built/local/tsserver.js:160410:21)
    at IOSession.send (/typescript-main/built/local/tsserver.js:160407:10)
    at IOSession.doOutput (/typescript-main/built/local/tsserver.js:160454:10)
    at IOSession.onMessage (/typescript-main/built/local/tsserver.js:162065:14)
    at Interface.<anonymous> (/typescript-main/built/local/tsserver.js:163451:14)
Req #12671 - references
    at formatMessage2 (/typescript-52048/built/local/tsserver.js:159410:21)
    at IOSession.writeMessage (/typescript-52048/built/local/tsserver.js:160417:21)
    at IOSession.send (/typescript-52048/built/local/tsserver.js:160414:10)
    at IOSession.doOutput (/typescript-52048/built/local/tsserver.js:160461:10)
    at IOSession.onMessage (/typescript-52048/built/local/tsserver.js:162072:14)
    at Interface.<anonymous> (/typescript-52048/built/local/tsserver.js:163458:14)

That is a filtered view of the text. To see the raw error text, go to RepoResults2/vercel.hyper.rawError.txt in the artifact folder

Last few requests

{"seq":12668,"type":"request","command":"completionInfo","arguments":{"file":"@PROJECT_ROOT@/bin/yarn-standalone.js","line":84971,"offset":121581,"includeExternalModuleExports":false,"includeInsertTextCompletions":true,"triggerKind":1}}
{"seq":12669,"type":"request","command":"completionEntryDetails","arguments":{"file":"@PROJECT_ROOT@/bin/yarn-standalone.js","line":84971,"offset":121581,"entryNames":["__webpack_require__"]}}
{"seq":12670,"type":"request","command":"completionInfo","arguments":{"file":"@PROJECT_ROOT@/bin/yarn-standalone.js","line":84971,"offset":122310,"includeExternalModuleExports":false,"includeInsertTextCompletions":true,"triggerKind":1}}
{"seq":12671,"type":"request","command":"references","arguments":{"file":"@PROJECT_ROOT@/bin/yarn-standalone.js","line":84971,"offset":123278}}

Repro Steps

  1. git clone https://github.com/vercel/hyper --recurse-submodules
  2. In dir hyper, run git reset --hard f494781ff22171cb4ab6081dbd6f71b13ae5f9a3
  3. Install packages (exact steps are below, but it might be easier to follow the repo readme)
    1. In dir hyper/app, run yarn install --ignore-engines --ignore-scripts --silent
    2. In dir hyper, run yarn install --ignore-engines --ignore-scripts --silent
  4. Back in the initial folder, download RepoResults2/vercel.hyper.replay.txt from the artifact folder
  5. npm install --no-save @typescript/server-replay
  6. npx tsreplay ./hyper ./vercel.hyper.replay.txt path/to/tsserver.js
  7. npx tsreplay --help to learn about helpful switches for debugging, logging, etc

@typescript-bot
Copy link
Collaborator

@RyanCavanaugh Here are the results of running the top-repos suite comparing main and refs/pull/52048/merge:

Something interesting changed - please have a look.

Details

microsoft/vscode

5 of 54 projects failed to build with the old tsc and were ignored

src/tsconfig.monaco.json

neoclide/coc.nvim

tsconfig.json

react-hook-form/react-hook-form

2 of 3 projects failed to build with the old tsc and were ignored

tsconfig.json

react-native-elements/react-native-elements

2 of 5 projects failed to build with the old tsc and were ignored

tsconfig.json

recharts/recharts

demo/tsconfig.json

tsconfig.json

sveltejs/svelte

2 of 3 projects failed to build with the old tsc and were ignored

src/runtime/tsconfig.json

@typescript-bot
Copy link
Collaborator

The TypeScript team hasn't accepted the linked issue #52036. If you can get it accepted, this PR will have a better chance of being reviewed.

@Andarist
Copy link
Contributor Author

Andarist commented Jan 16, 2023

@RyanCavanaugh the union cases that you mentioned are conceptually the same as the issue that I'm trying to fix here, so I guess that if we decide to move this PR forward (in some shape) then that would be a breaking change for those situations. I don't see any additional heuristics that would keep those cases working while erroring on the case linked to this PR.

The Number case is an edge case but well, conceptually it's a valid one - so this could be fixed here.

Cases discovered by the top are also related to unions and one is related to unknown. There are also some LSP issues reported here. It's surprising that this has affected LSP anyhow so I wonder if those are not false positives somehow but I could investigate this further and fix the issues if they are legit.

All in all, it kinda boils down to making a decision about the desired behavior here and only your team can do that. I'm more than happy to work on an adjusted algorithm for this but I'd have to know what that is (if it would be any different from what I have in this PR). It's not that I'm not willing to experiment and propose algorithm adjustments - it's just that the whole thing is very subtle and you have the best idea of what kind of disputable you might want to allow. So at the very least, I could use a little bit of a push from your team's side to explore the improved algorithm.

Let me know what you think, if you want to act on this anyhow or if you prefer to close the PR. From my PoV, most of the new errors are desired - those cases won't throw, so they are "type-safe" but they rely on some implicit coercions~ that are often super easy to miss. This change would require adding some additional typeof x === 'number' to codebases but I'd consider the RoI worth it.

@RyanCavanaugh RyanCavanaugh added the Breaking Change Would introduce errors in existing code label Jan 19, 2023
@Andarist
Copy link
Contributor Author

I see in the latest design notes that:

Conclusion: Feels like this PR is a good start. Want to bring this in for 5.0.

What are the next steps here then? Which cases should I fix and which cases do we want to keep as "broken"? cc @RyanCavanaugh @DanielRosenwasser

@RyanCavanaugh
Copy link
Member

There might be some more corner cases to explore here, but I think this is effectively what we want to "try" in the 5.0 beta to gauge reaction and figure out what to tweak (or if it's just going to have to roll back entirely). I'm leaning toward merge as-is. @DanielRosenwasser good to go?

@Andarist
Copy link
Contributor Author

While working on this, I initially made a different change but then discovered that TS currently allows this:

class A {
    foo() {}
}

class B extends A {
    bar() {}
}

declare const a: A
declare const b: B

a < b // ok?

So I went with a different route, trying to keep this behavior as I thought that it was desired. But given the discussion and an attempt to change the base behavior - should this case (and similar ones) be considered an error? How do we define what TS treats as a valid comparison?

From my PoV, allowing the comparison to be OK based on both types being comparable is not that useful and is a footgun. I'm specifically calling out this part of the check:

!leftAssignableToNumber && !rightAssignableToNumber && areTypesComparable(left, right);

@redradist
Copy link

@Andarist
FYI, Regarding this issue with implicit coercion I wrote a library https://github.com/redradist/SafeScript that completly exclude implicit coersion

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Breaking Change Would introduce errors in existing code For Uncommitted Bug PR for untriaged, rejected, closed or missing bug
Projects
Archived in project
Development

Successfully merging this pull request may close these issues.

typescript passes number | Promise<number> as if it were number (or something like that)
5 participants