microsoft / microsoft/TypeScript
Equivalent Tuple with Rest types not duck-typing properly
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Go
- Sterne
- 111k
- Forks
- 14.3k
- Ø Merge
- 1 T. 19 Std.
- Gemergte PRs (30 T.)
- 117
Beschreibung
Bug Report
A tuple type with a rest element doesn't duck-type properly to the similar tuple type, although they are conceptually identical, causing a ts2345 error to show up when trying to use one with the other.
The type I tested was a type defining a non-empty array. It looks like there's a bug because the location of the "non-empty item" in the definition matters for typescript, although there shouldn't be any difference in the kind of arrays that are accepted for each type.
🔎 Search Terms
- tuple
- rest
🕗 Version & Regression Information
Since 4.2 where rest params where allowed a the start of a tuple too
- This is the behavior in every version I tried, and I reviewed the FAQ for entries about tuple
⏯ Playground Link
Playground link with relevant code
💻 Code
type FirstItem<T> = [T, ...T[]];
type LastItem<T> = [...T[], T];
const f0: FirstItem<number> = []
const l0: LastItem<number> = []
const f1: FirstItem<number> = [1]
const l1: LastItem<number> = [1]
const f2: FirstItem<number> = [1, 2]
const l2: LastItem<number> = [1, 2]
function foo(x: FirstItem<number>): void {
// DO NOTHING
}
foo(f2) // OK
foo(l2) // ts2345
const x: number[] = [2, 3, 4]
foo([1, ...x]) // OK
foo([...x, 5]) // ts2345
🙁 Actual behavior
- ts2345 is shown
🙂 Expected behavior
- the two types should be considered equivalent and duck-typeable.
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne mit dem Playground-Link und dem reduzierten TypeScript-Beispiel, das FirstItem und LastItem vergleicht. Verfolge die Zuweisbarkeit von Rest-Elementen in Tupeln und die Diagnose ts2345 für foo(l2) und foo([...x, 5]). Als erledigt gilt, dass äquivalente nichtleere Tupeltypen ohne Regressionen bei den bestehenden Tupelprüfungen austauschbar akzeptiert werden.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- typescript
- Bereich
- compilers
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100