Revision e71614a185eaafa080664902f1bb7fa2802dbd01 authored by Eli Barzilay on 13 February 2020, 21:09:20 UTC, committed by Eli Barzilay on 27 February 2020, 21:43:29 UTC
Fixes #32465.

After this was done, I continued to extend the implementation to handle
TupleLike types but it'ss broken since JS doesn't allow splicing
TupleLike values into array literals so pulled that out, and instead
keeping it for reference below.  (It Includes tests, which are broken
too.)

modified   src/compiler/checker.ts
@@ -22268,6 +22268,21 @@ namespace ts {
                         else hasNonEndingSpreadElement = true;
                     }
                 }
+                else if (spreadType && isTupleLikeType(spreadType)) {
+                    let i = 0, tupleEltType: Type | undefined;
+                    while (tupleEltType = getTypeOfPropertyOfType(spreadType, "" + i as __String)) {
+                        elementTypes.push(tupleEltType);
+                        i++;
+                    }
+                    const stringIndexInfo = getIndexInfoOfType(spreadType, IndexKind.String);
+                    const numberIndexInfo = getIndexInfoOfType(spreadType, IndexKind.Number);
+                    if (stringIndexInfo || numberIndexInfo) {
+                        if (stringIndexInfo) elementTypes.push(stringIndexInfo.type);
+                        if (numberIndexInfo) elementTypes.push(numberIndexInfo.type);
+                        if (i === elementCount - 1) hasEndingSpreadElement = true;
+                        else hasNonEndingSpreadElement = true;
+                    }
+                }
                 else {
                     if (inDestructuringPattern && spreadType) {
                         // Given the following situation:
new file   tests/cases/compiler/spliceTupleLikesWIntegers.ts
@@ -0,0 +1,23 @@
+declare const sb: { [0]: string, [1]: boolean };
+
+let k1: [number, string, boolean];
+k1 = [1, ...sb];
+
+let k2: [number, string, boolean, number];
+k2 = [1, ...sb, 1];
+
+// declare const sb_: [string, ...boolean[]];
+
+// let k3: [number, string, ...boolean[]];
+// k3 = [1, ...sb_];
+
+// declare const sbb_: [string, boolean, ...boolean[]];
+
+// let k4: [number, string, ...boolean[]];
+// k4 = [1, ...sbb_];
+
+// let k5: [number, string, boolean, ...boolean[]];
+// k5 = [1, ...sbb_];
+
+// let k6: [number, string, boolean, boolean, ...boolean[]];
+// k6 = [1, ...sbb_];
new file   tests/cases/compiler/spliceTupleLikesWStrings.ts
@@ -0,0 +1,23 @@
+declare const sb: { 0: string, 1: boolean };
+
+let k1: [number, string, boolean];
+k1 = [1, ...sb];
+
+let k2: [number, string, boolean, number];
+k2 = [1, ...sb, 1];
+
+declare const sb_: { 0: string, [s: string]: (boolean|string) };
+
+let k3: [number, string, ...(boolean|string)[]];
+k3 = [1, ...sb_];
+
+declare const sbb_: { 0: string, 1: boolean, [s: string]: (boolean|string) };
+
+let k4: [number, string, boolean, ...(boolean|string)[]];
+k4 = [1, ...sbb_];
+
+// let k5: [number, string, boolean, ...(boolean|string)[]];
+// k5 = [1, ...sbb_];
+
+// let k6: [number, string, boolean, boolean, ...(boolean|string)[]];
+// k6 = [1, ...sbb_];
1 parent 6c5c48c
Raw File
AUTHORS.md
TypeScript is authored by:

 - 0verk1ll
 - Abubaker Bashir
 - Adam Freidin
 - Adam Postma
 - Adi Dahiya
 - Aditya Daflapurkar
 - Adnan Chowdhury
 - Adrian Leonhard
 - Adrien Gibrat
 - Ahmad Farid
 - Ajay Poshak
 - Alan Agius
 - Alan Pierce
 - Alessandro Vergani
 - Alex Chugaev
 - Alex Eagle
 - Alex Khomchenko
 - Alex Ryan
 - Alexander
 - Alexander Kuvaev
 - Alexander Rusakov
 - Alexander Tarasyuk
 - Ali Sabzevari
 - Aluan Haddad
 - amaksimovich2
 - Anatoly Ressin
 - Anders Hejlsberg
 - Anders Kaseorg
 - Andre Sutherland
 - Andreas Martin
 - Andrej Baran
 - Andrew
 - Andrew Branch
 - Andrew Casey
 - Andrew Faulkner
 - Andrew Ochsner
 - Andrew Stegmaier
 - Andrew Z Allen
 - Andrey Roenko
 - Andrii Dieiev
 - András Parditka
 - Andy Hanson
 - Anil Anar
 - Anix
 - Anton Khlynovskiy
 - Anton Tolmachev
 - Anubha Mathur
 - AnyhowStep
 - Armando Aguirre
 - Arnaud Tournier
 - Arnav Singh
 - Arpad Borsos
 - Artem Tyurin
 - Arthur Ozga
 - Asad Saeeduddin
 - Austin Cummings
 - Avery Morin
 - Aziz Khambati
 - Basarat Ali Syed
 - @begincalendar
 - Ben Duffield
 - Ben Lichtman
 - Ben Mosher
 - Benedikt Meurer
 - Benjamin Bock
 - Benjamin Lichtman
 - Benny Neugebauer
 - BigAru
 - Bill Ticehurst
 - Blaine Bublitz
 - Blake Embrey
 - @bluelovers
 - @bootstraponline
 - Bowden Kelly
 - Bowden Kenny
 - Brad Zacher
 - Brandon Banks
 - Brandon Bloom
 - Brandon Slade
 - Brendan Kenny
 - Brett Mayen
 - Brian Terlson
 - Bryan Forbes
 - Caitlin Potter
 - Caleb Sander
 - Cameron Taggart
 - @cedvdb
 - Charles
 - Charles Pierce
 - Charly POLY
 - Chris Bubernak
 - Chris Patterson
 - christian
 - Christophe Vidal
 - Chuck Jazdzewski
 - Clay Miller
 - Colby Russell
 - Colin Snover
 - Collins Abitekaniza
 - Connor Clark
 - Cotton Hou
 - csigs
 - Cyrus Najmabadi
 - Dafrok Zhang
 - Dahan Gong
 - Daiki Nishikawa
 - Dan Corder
 - Dan Freeman
 - Dan Quirk
 - Dan Rollo
 - Daniel Gooss
 - Daniel Imms
 - Daniel Krom
 - Daniel Król
 - Daniel Lehenbauer
 - Daniel Rosenwasser
 - David Li
 - David Sheldrick
 - David Sherret
 - David Souther
 - David Staheli
 - Denis Nedelyaev
 - Derek P Sifford
 - Dhruv Rajvanshi
 - Dick van den Brink
 - Diogo Franco (Kovensky)
 - Dirk Bäumer
 - Dirk Holtwick
 - Dmitrijs Minajevs
 - Dom Chen
 - Donald Pipowitch
 - Doug Ilijev
 - dreamran43@gmail.com
 - @e-cloud
 - Ecole Keine
 - Eddie Jaoude
 - Edward Thomson
 - EECOLOR
 - Eli Barzilay
 - Elizabeth Dinella
 - Ely Alamillo
 - Eric Grube
 - Eric Tsang
 - Erik Edrosa
 - Erik McClenney
 - Esakki Raj
 - Ethan Resnick
 - Ethan Rubio
 - Eugene Timokhov
 - Evan Cahill
 - Evan Martin
 - Evan Sebastian
 - ExE Boss
 - Eyas Sharaiha
 - Fabian Cook
 - @falsandtru
 - Filipe Silva
 - @flowmemo
 - Forbes Lindesay
 - Francois Hendriks
 - Francois Wouts
 - Frank Wallis
 - František Žiacik
 - Frederico Bittencourt
 - fullheightcoding
 - Gabe Moothart
 - Gabriel Isenberg
 - Gabriela Araujo Britto
 - Gabriela Britto
 - gb714us
 - Gilad Peleg
 - Godfrey Chan
 - Gorka Hernández Estomba
 - Graeme Wicksted
 - Guillaume Salles
 - Guy Bedford
 - hafiz
 - Halasi Tamás
 - Hendrik Liebau
 - Henry Mercer
 - Herrington Darkholme
 - Hoang Pham
 - Holger Jeromin
 - Homa Wong
 - Hye Sung Jung
 - Iain Monro
 - @IdeaHunter
 - Igor Novozhilov
 - Igor Oleinikov
 - Ika
 - iliashkolyar
 - IllusionMH
 - Ingvar Stepanyan
 - Ingvar Stepanyan
 - Isiah Meadows
 - ispedals
 - Ivan Enderlin
 - Ivo Gabe de Wolff
 - Iwata Hidetaka
 - Jack Bates
 - Jack Williams
 - Jake Boone
 - Jakub Korzeniowski
 - Jakub Młokosiewicz
 - James Henry
 - James Keane
 - James Whitney
 - Jan Melcher
 - Jason Freeman
 - Jason Jarrett
 - Jason Killian
 - Jason Ramsay
 - JBerger
 - Jean Pierre
 - Jed Mao
 - Jeff Wilcox
 - Jeffrey Morlan
 - Jesse Schalken
 - Jesse Trinity
 - Jing Ma
 - Jiri Tobisek
 - Joe Calzaretta
 - Joe Chung
 - Joel Day
 - Joey Watts
 - Johannes Rieken
 - John Doe
 - John Vilk
 - Jonathan Bond-Caron
 - Jonathan Park
 - Jonathan Toland
 - Jordan Harband
 - Jordi Oliveras Rovira
 - Joscha Feth
 - Joseph Wunderlich
 - Josh Abernathy
 - Josh Goldberg
 - Josh Kalderimis
 - Josh Soref
 - Juan Luis Boya García
 - Julian Williams
 - Justin Bay
 - Justin Johansson
 - jwbay
 - K. Preißer
 - Kagami Sascha Rosylight
 - Kanchalai Tanglertsampan
 - karthikkp
 - Kate Miháliková
 - Keen Yee Liau
 - Keith Mashinter
 - Ken Howard
 - Kenji Imamula
 - Kerem Kat
 - Kevin Donnelly
 - Kevin Gibbons
 - Kevin Lang
 - Khải
 - Kitson Kelly
 - Klaus Meinhardt
 - Kris Zyp
 - Kyle Kelley
 - Kārlis Gaņģis
 - laoxiong
 - Leon Aves
 - Limon Monte
 - Lorant Pinter
 - Lucien Greathouse
 - Luka Hartwig
 - Lukas Elmer
 - M.Yoshimura
 - Maarten Sijm
 - Magnus Hiie
 - Magnus Kulke
 - Manish Bansal
 - Manish Giri
 - Marcus Noble
 - Marin Marinov
 - Marius Schulz
 - Markus Johnsson
 - Markus Wolf
 - Martin
 - Martin Hiller
 - Martin Johns
 - Martin Probst
 - Martin Vseticka
 - Martyn Janes
 - Masahiro Wakame
 - Mateusz Burzyński
 - Matt Bierner
 - Matt McCutchen
 - Matt Mitchell
 - Matthew Aynalem
 - Matthew Miller
 - Mattias Buelens
 - Max Heiber
 - Maxwell Paul Brickner
 - @meyer
 - Micah Zoltu
 - @micbou
 - Michael
 - Michael Crane
 - Michael Henderson
 - Michael Tamm
 - Michael Tang
 - Michal Przybys
 - Mike Busyrev
 - Mike Morearty
 - Milosz Piechocki
 - Mine Starks
 - Minh Nguyen
 - Mohamed Hegazy
 - Mohsen Azimi
 - Mukesh Prasad
 - Myles Megyesi
 - Nathan Day
 - Nathan Fenner
 - Nathan Shively-Sanders
 - Nathan Yee
 - ncoley
 - Nicholas Yang
 - Nicu Micleușanu
 - @nieltg
 - Nima Zahedi
 - Noah Chen
 - Noel Varanda
 - Noel Yoo
 - Noj Vek
 - nrcoley
 - Nuno Arruda
 - Oleg Mihailik
 - Oleksandr Chekhovskyi
 - Omer Sheikh
 - Orta Therox
 - Orta Therox
 - Oskar Grunning
 - Oskar Segersva¨rd
 - Oussama Ben Brahim
 - Ozair Patel
 - Patrick McCartney
 - Patrick Zhong
 - Paul Koerbitz
 - Paul van Brenk
 - @pcbro
 - Pedro Maltez
 - Pete Bacon Darwin
 - Peter Burns
 - Peter Šándor
 - Philip Pesca
 - Philippe Voinov
 - Pi Lanningham
 - Piero Cangianiello
 - Pierre-Antoine Mills
 - @piloopin
 - Pranav Senthilnathan
 - Prateek Goel
 - Prateek Nayak
 - Prayag Verma
 - Priyantha Lankapura
 - @progre
 - Punya Biswal
 - r7kamura
 - Rado Kirov
 - Raj Dosanjh
 - rChaser53
 - Reiner Dolp
 - Remo H. Jansen
 - @rflorian
 - Rhys van der Waerden
 - @rhysd
 - Ricardo N Feliciano
 - Richard Karmazín
 - Richard Knoll
 - Roger Spratley
 - Ron Buckton
 - Rostislav Galimsky
 - Rowan Wyborn
 - rpgeeganage
 - Ruwan Pradeep Geeganage
 - Ryan Cavanaugh
 - Ryan Clarke
 - Ryohei Ikegami
 - Salisbury, Tom
 - Sam Bostock
 - Sam Drugan
 - Sam El-Husseini
 - Sam Lanning
 - Sangmin Lee
 - Sanket Mishra
 - Sarangan Rajamanickam
 - Sasha Joseph
 - Sean Barag
 - Sergey Rubanov
 - Sergey Shandar
 - Sergey Tychinin
 - Sergii Bezliudnyi
 - Sergio Baidon
 - Sharon Rolel
 - Sheetal Nandi
 - Shengping Zhong
 - Sheon Han
 - Shyyko Serhiy
 - Siddharth Singh
 - sisisin
 - Slawomir Sadziak
 - Solal Pirelli
 - Soo Jae Hwang
 - Stan Thomas
 - Stanislav Iliev
 - Stanislav Sysoev
 - Stas Vilchik
 - Stephan Ginthör
 - Steve Lucco
 - @styfle
 - Sudheesh Singanamalla
 - Suhas
 - Suhas Deshpande
 - superkd37
 - Sébastien Arod
 - @T18970237136
 - @t_
 - Tan Li Hau
 - Tapan Prakash
 - Taras Mankovski
 - Tarik Ozket
 - Tetsuharu Ohzeki
 - The Gitter Badger
 - Thomas den Hollander
 - Thorsten Ball
 - Tien Hoanhtien
 - Tim Lancina
 - Tim Perry
 - Tim Schaub
 - Tim Suchanek
 - Tim Viiding-Spader
 - Tingan Ho
 - Titian Cernicova-Dragomir
 - tkondo
 - Todd Thomson
 - togru
 - Tom J
 - Torben Fitschen
 - Toxyxer
 - @TravCav
 - Troy Tae
 - TruongSinh Tran-Nguyen
 - Tycho Grouwstra
 - uhyo
 - Vadi Taslim
 - Vakhurin Sergey
 - Valera Rozuvan
 - Vilic Vane
 - Vimal Raghubir
 - Vladimir Kurchatkin
 - Vladimir Matveev
 - Vyacheslav Pukhanov
 - Wenlu Wang
 - Wes Souza
 - Wesley Wigham
 - William Orr
 - Wilson Hobbs
 - xiaofa
 - xl1
 - Yacine Hmito
 - Yang Cao
 - York Yao
 - @yortus
 - Yoshiki Shibukawa
 - Yuichi Nukiyama
 - Yuval Greenfield
 - Yuya Tanaka
 - Z
 - Zeeshan Ahmed
 - Zev Spitz
 - Zhengbo Li
 - Zixiang Li
 - @Zzzen
 - 阿卡琳
back to top