SC2003 'string | undefined' when a method returning an element of its array field is used inline
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 30/100
- Tipo di issue
- Bug
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Attiva
- Stack tecnologico
- typescript
- Ambito
- compilers
Direzione di ricerca
Reproduce first: save the snippet as repro.ts and run scriptc build repro.ts; the rejection is emitted by the SC2003 union-conversion layout check. Locate where that diagnostic fires and how an inline method-call result reaches it differently than a const-bound value; the const and plain-function variants that already compile are the contrast. Read the #2319 fix for "string concatenation with possibly missing reads" as prior art. Done means the repro compiles and prints 2 with a regression test guarding it.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
A class method declared to return string returns an element of its own string[] field. Using the call result inline, as in obj.last().length, is rejected with SC2003 got 'string | undefined'. Binding the result to a const first compiles.
Reproduction
class Args {
list: string[] = ["a", "bc"];
last(): string {
return this.list[this.list.length - 1];
}
}
console.log(new Args().last().length);
$ node repro.ts
2
$ scriptc build repro.ts -o repro
repro.ts:7:13 - error SC2003: union conversion has no unambiguous layout mapping: expected 'string', got 'string | undefined' (each source arm needs an identical destination arm, a unique compatible record/array layout, or a shared literal discriminant selecting compatible layouts)
It fails 3 out of 3 builds.
What matters
| variant | result |
|---|---|
| repro as above | SC2003 |
const value = new Args().last(); console.log(value.length); |
compiles, prints 2 |
same body as a plain function last(list: string[]): string, used inline |
compiles, prints 2 |
plain function reading the array from a Map, with undefined/empty guards, used inline |
compiles |
So it needs both a method that returns an element read and an inline use of the call result. At the call site the declared return type is string, and there's no union in the source. The limitations page (array-bounds-and-runtime-errors) says a missing element that reaches storage that can't hold undefined throws a TypeError at run time. A build-time rejection that disappears once the value goes through a const looks inconsistent with that.
Possibly related
#2141 (fixed by #2319, after 0.4.5) has the same shape: an inline call result, a body that reads an array element, and binding to a variable avoids it. Its trigger was string concatenation ("x-" + PAD[i]), and the fix describes "string concatenation with possibly missing reads". This repro has no concatenation, and no release after #2319 exists yet, so I couldn't check whether it's covered.
Versions
- scriptc 0.0.36: compiles and prints
2. - 0.1.1, the next version published to npm: SC2003.
- 0.4.5: still SC2003.
SCRIPTC_CHECKER=tsgogives the same result.
Where it came from
A CLI argument parser, args.value("as", "").length > 0. value() returns the last element of a string[] or a fallback. This compiled with 0.0.36 and blocks upgrading to 0.4.5.
Environment
- scriptc 0.4.5 (
@scriptc/cli-darwin-arm64) - macOS 26 arm64
- Node v24.16.0 as the reference
- Lingua principale
- TypeScript
- Stelle
- 6.4k
- Fork
- 201
- Merge medio
- 6h 24m
- PR unite (30g)
- 913
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di vercel-labs/scriptc
-
fs.readSync rejects valid large BigInt file offsetsForse già presa @MathurAditya724 l’ha presa 2 giorni fa. Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 20/100
vercel-labs/scriptc#2404 ·
I maintainer di solito rispondono entro 1 giorno
-
for-in rejects records that may be null or undefinedForse già presa @MathurAditya724 l’ha presa 2 giorni fa. Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 25/100
vercel-labs/scriptc#2403 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 30/100
vercel-labs/scriptc#2399 ·
I maintainer di solito rispondono entro 1 giorno
-
Large LLVM metadata tables crash compilation with a stack overflowForse già presa @MathurAditya724 l’ha presa 2 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 22/100
vercel-labs/scriptc#2394 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 20/100
vercel-labs/scriptc#2209 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di vercel-labs/scriptc
Issue simili
-
Difficoltà 1/5 1-3 ore Idoneità per principianti 66/100
I maintainer di solito rispondono entro 1 giorno
-
area:plugins area:security area:skills bug has repro
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
anthropics/claude-code#105911 ·
I maintainer di solito rispondono entro 1 giorno
-
documentation good first issue help wanted
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
dev-five-git/devup-ui#879 ·
I maintainer di solito rispondono entro 11 giorni
-
openspec-apply-change skill: when blocked, may select a ready artifact unrelated to missingArtifactsAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
Fission-AI/OpenSpec#2165 ·
I maintainer di solito rispondono entro 1 giorno
-
🐞 bug 🧐 unconfirmed
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
Tencent/tdesign-vue-next#7032 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno