Skip to content

Commit 54ea7ac

Browse files
seohyun0120bumkeyy
andauthored
TS4.0 Variadic Tuple Types (#172)
* Variadic Tuple Types ๋ฒˆ์—ญ * ๊ธฐ์กด ๋ฌธ์„œ์™€ ๋™์ผํ•˜๊ฒŒ ์ˆ˜์ • * ๋ผ์ธ ๋™์ผํ•˜๊ฒŒ ์„ค์ • * ๋ผ์ธ ๋งž์ถค * ๋ฒˆ์—ญ ์ˆ˜์ • Co-authored-by: Kibeom Kwon <[email protected]> * 1์ฐจ ์ˆ˜์ • * 3์ฐจ ์ˆ˜์ • Co-authored-by: Kibeom Kwon <[email protected]>
1 parent 802ff13 commit 54ea7ac

File tree

1 file changed

+41
-41
lines changed

1 file changed

+41
-41
lines changed

โ€Žpages/release-notes/typescript-4.0.md

+41-41
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,17 @@ permalink: /docs/handbook/release-notes/typescript-4-0.html
55
oneline: TypeScript 4.0 Release Notes
66
---
77

8-
## Variadic Tuple Types
8+
## ๊ฐ€๋ณ€ ์ธ์ž ํŠœํ”Œ ํƒ€์ž… (Variadic Tuple Types)
99

10-
Consider a function in JavaScript called `concat` that takes two array or tuple types and concatenates them together to make a new array.
10+
๋ฐฐ์—ด์ด๋‚˜ ํŠœํ”Œ ํƒ€์ž… ๋‘ ๊ฐœ๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“œ๋Š” JavaScript์˜ `concat` ํ•จ์ˆ˜์— ๋Œ€ํ•ด์„œ ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค.
1111

1212
```js
1313
function concat(arr1, arr2) {
1414
return [...arr1, ...arr2];
1515
}
1616
```
1717

18-
Also consider `tail`, that takes an array or tuple, and returns all elements but the first.
18+
๊ทธ๋ฆฌ๊ณ , ๋ฐฐ์—ด์ด๋‚˜ ํŠœํ”Œ์„ ๋ณ€์ˆ˜๋กœ ์ž…๋ ฅ๋ฐ›์•„ ์ฒซ ๋ฒˆ์งธ ์›์†Œ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” `tail` ํ•จ์ˆ˜์— ๋Œ€ํ•ด์„œ๋„ ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค.
1919

2020
```js
2121
function tail(arg) {
@@ -24,9 +24,9 @@ function tail(arg) {
2424
}
2525
```
2626

27-
How would we type either of these in TypeScript?
27+
TypeScript์—์„œ๋Š” ์ด ๋‘ ํ•จ์ˆ˜์˜ ํƒ€์ž…์„ ์–ด๋–ป๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?
2828

29-
For `concat`, the only valid thing we could do in older versions of the language was to try and write some overloads.
29+
`concat`์˜ ๊ฒฝ์šฐ, ์ด์ „ ๋ฒ„์ „์—์„œ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์œ ์ผํ–ˆ์Šต๋‹ˆ๋‹ค.
3030

3131
```ts
3232
function concat(arr1: [], arr2: []): [];
@@ -38,8 +38,8 @@ function concat<A, B, C, D, E>(arr1: [A, B, C, D, E], arr2: []): [A, B, C, D, E]
3838
function concat<A, B, C, D, E, F>(arr1: [A, B, C, D, E, F], arr2: []): [A, B, C, D, E, F];)
3939
```
4040

41-
Uh...okay, that's...seven overloads for when the second array is always empty.
42-
Let's add some for when `arr2` has one argument.
41+
์Œ... ๋„ค, ์ด ์˜ค๋ฒ„๋กœ๋“œ๋“ค์˜ ๋‘ ๋ฒˆ์งธ ๋ฐฐ์—ด์€ ์ „๋ถ€ ๋น„์–ด์žˆ์Šต๋‹ˆ๋‹ค.
42+
์ด๋•Œ, `arr2`๊ฐ€ ํ•˜๋‚˜์˜ ์ธ์ž๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์ถ”๊ฐ€ํ•ด๋ด…์‹œ๋‹ค.
4343

4444
<!-- prettier-ignore -->
4545
```ts
@@ -52,26 +52,26 @@ function concat<A1, B1, C1, D1, E1, A2>(arr1: [A1, B1, C1, D1, E1], arr2: [A2]):
5252
function concat<A1, B1, C1, D1, E1, F1, A2>(arr1: [A1, B1, C1, D1, E1, F1], arr2: [A2]): [A1, B1, C1, D1, E1, F1, A2];
5353
```
5454

55-
We hope it's clear that this is getting unreasonable.
56-
Unfortunately, you'd also end up with the same sorts of issues typing a function like `tail`.
55+
์ด๋Ÿฐ ์˜ค๋ฒ„๋กœ๋”ฉ ํ•จ์ˆ˜๋“ค์€ ๋ถ„๋ช… ๋น„ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.
56+
์•ˆํƒ€๊น๊ฒŒ๋„, `tail` ํ•จ์ˆ˜๋ฅผ ํƒ€์ดํ•‘ํ•  ๋•Œ๋„ ์ด์™€ ๋น„์Šทํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
5757

58-
This is another case of what we like to call "death by a thousand overloads", and it doesn't even solve the problem generally.
59-
It only gives correct types for as many overloads as we care to write.
60-
If we wanted to make a catch-all case, we'd need an overload like the following:
58+
์ด๊ฒƒ์€ "์ฒœ ๊ฐœ์˜ ์˜ค๋ฒ„๋กœ๋“œ๋กœ ์ธํ•œ ์ฃฝ์Œ(death by a thousand overloads)"์˜ ํ•˜๋‚˜์˜ ๊ฒฝ์šฐ์ด๋ฉฐ, ์‹ฌ์ง€์–ด ๋Œ€๋ถ€๋ถ„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€๋„ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
59+
์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ๋งŒํผ์˜ ์˜ค๋ฒ„๋กœ๋“œ์— ํ•œํ•ด์„œ๋งŒ ์˜ฌ๋ฐ”๋ฅธ ํƒ€์ž…์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
60+
ํฌ๊ด„์ ์ธ ์ผ€์ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฒ„๋กœ๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
6161

6262
```ts
6363
function concat<T, U>(arr1: T[], arr2: U[]): Array<T | U>;
6464
```
6565

66-
But that signature doesn't encode anything about the lengths of the input, or the order of the elements, when using tuples.
66+
๊ทธ๋Ÿฌ๋‚˜ ์œ„ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋Š” ํŠœํ”Œ์„ ์‚ฌ์šฉํ•  ๋•Œ ์ž…๋ ฅ ๊ธธ์ด๋‚˜ ์š”์†Œ ์ˆœ์„œ์— ๋Œ€ํ•œ ์–ด๋–ค ๊ฒƒ๋„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
6767

68-
TypeScript 4.0 brings two fundamental changes, along with inference improvements, to make typing these possible.
68+
TypeScript 4.0์€ ํƒ€์ž… ์ถ”๋ก  ๊ฐœ์„ ์„ ํฌํ•จํ•œ ๋‘ ๊ฐ€์ง€ ํ•ต์‹ฌ์ ์ธ ๋ณ€ํ™”๋ฅผ ๋„์ž…ํ•ด ์ด๋Ÿฌํ•œ ํƒ€์ดํ•‘์„ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
6969

70-
The first change is that spreads in tuple type syntax can now be generic.
71-
This means that we can represent higher-order operations on tuples and arrays even when we don't know the actual types we're operating over.
72-
When generic spreads are instantiated (or, replaced with a real type) in these tuple types, they can produce other sets of array and tuple types.
70+
์ฒซ ๋ฒˆ์งธ ๋ณ€ํ™”๋Š” ํŠœํ”Œ ํƒ€์ž… ๊ตฌ๋ฌธ์˜ ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž์—์„œ ์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.
71+
์šฐ๋ฆฌ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ์‹ค์ œ ํƒ€์ž…์„ ๋ชจ๋ฅด๋”๋ผ๋„ ํŠœํ”Œ๊ณผ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ๊ณ ์ฐจํ•จ์ˆ˜๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.
72+
์ด๋Ÿฌํ•œ ํŠœํ”Œ ํƒ€์ž…์—์„œ ์ œ๋„ค๋ฆญ ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž๊ฐ€ ์ธ์Šคํ„ด์Šคํ™”(ํ˜น์€, ์‹ค์ œ ํƒ€์ž…์œผ๋กœ ๋Œ€์ฒด)๋˜๋ฉด ๋˜ ๋‹ค๋ฅธ ๋ฐฐ์—ด์ด๋‚˜ ํŠœํ”Œ ํƒ€์ž… ์„ธํŠธ๋ฅผ ์ƒ์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
7373

74-
For example, that means we can type function like `tail`, without our "death by a thousand overloads" issue.
74+
์˜ˆ๋ฅผ ๋“ค์–ด, `tail` ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ "์ฒœ ๊ฐœ์˜ ์˜ค๋ฒ„๋กœ๋“œ๋กœ ์ธํ•œ ์ฃฝ์Œ(death by a thousand overloads)"์ด์Šˆ ์—†์ด ํƒ€์ดํ•‘ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
7575

7676
```ts
7777
function tail<T extends any[]>(arr: readonly [any, ...T]) {
@@ -83,41 +83,41 @@ const myTuple = [1, 2, 3, 4] as const;
8383
const myArray = ["hello", "world"];
8484

8585
const r1 = tail(myTuple);
86-
// ^?
86+
// ^ = const r1: [2, 3, 4]
8787

8888
const r2 = tail([...myTuple, ...myArray] as const);
89-
// ^?
89+
// ^ = const r2: [2, 3, 4, ...string[]]
9090
```
9191

92-
The second change is that rest elements can occur anywhere in a tuple - not just at the end!
92+
๋‘ ๋ฒˆ์งธ ๋ณ€ํ™”๋Š” ๋‚˜๋จธ์ง€ ์š”์†Œ๊ฐ€ ๋๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํŠœํ”Œ์˜ ์–ด๋Š ๊ณณ์—์„œ๋„ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
9393

9494
```ts
9595
type Strings = [string, string];
9696
type Numbers = [number, number];
9797

9898
type StrStrNumNumBool = [...Strings, ...Numbers, boolean];
99-
// ^?
99+
// ^ = type StrStrNumNumBool = [string, string, number, number, boolean]
100100
```
101101

102-
Previously, TypeScript would issue an error like the following:
102+
์ด์ „์—๋Š”, TypeScript๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๋ฅผ ์ƒ์„ฑํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค:
103103

104104
```
105105
A rest element must be last in a tuple type.
106106
```
107107

108-
But with TypeScript 4.0, this restriction is relaxed.
108+
TypeScript 4.0์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ œํ•œ์ด ์™„ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
109109

110-
Note that in cases when we spread in a type without a known length, the resulting type becomes unbounded as well, and all the following elements factor into the resulting rest element type.
110+
๊ธธ์ด๊ฐ€ ์ •ํ•ด์ง€์ง€ ์•Š์€ ํƒ€์ž…์„ ํ™•์žฅํ•˜๋ ค๊ณ ํ•  ๋•Œ, ๊ฒฐ๊ณผ์˜ ํƒ€์ž…์€ ์ œํ•œ๋˜์ง€ ์•Š์œผ๋ฉฐ, ๋‹ค์Œ ๋ชจ๋“  ์š”์†Œ๊ฐ€ ๊ฒฐ๊ณผ์˜ ๋‚˜๋จธ์ง€ ์š”์†Œ ํƒ€์ž…์— ํฌํ•จ๋˜๋Š” ์ ์— ์œ ์˜ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
111111

112112
```ts
113113
type Strings = [string, string];
114114
type Numbers = number[];
115115

116116
type Unbounded = [...Strings, ...Numbers, boolean];
117-
// ^?
117+
// ^ = type Unbounded = [string, string, ...(number | boolean)[]]
118118
```
119119

120-
By combining both of these behaviors together, we can write a single well-typed signature for `concat`:
120+
์ด ๋‘ ๊ฐ€์ง€ ๋™์ž‘์„ ํ•จ๊ป˜ ๊ฒฐํ•ฉํ•˜์—ฌ, `concat`์— ๋Œ€ํ•ด ํƒ€์ž…์ด ์ œ๋Œ€๋กœ ์ •์˜๋œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
121121

122122
```ts
123123
type Arr = readonly any[];
@@ -127,20 +127,20 @@ function concat<T extends Arr, U extends Arr>(arr1: T, arr2: U): [...T, ...U] {
127127
}
128128
```
129129

130-
While that one signature is still a bit lengthy, it's just one signature that doesn't have to be repeated, and it gives predictable behavior on all arrays and tuples.
130+
ํ•˜๋‚˜์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ ์กฐ๊ธˆ ๊ธธ๋”๋ผ๋„, ๋ฐ˜๋ณตํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ํ•˜๋‚˜์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜์ผ ๋ฟ์ด๋ฉฐ, ๋ชจ๋“  ๋ฐฐ์—ด๊ณผ ํŠœํ”Œ์—์„œ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ํ–‰๋™์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
131131

132-
This functionality on its own is great, but it shines in more sophisticated scenarios too.
133-
For example, consider a function to [partially apply arguments](https://en.wikipedia.org/wiki/Partial_application) called `partialCall`.
134-
`partialCall` takes a function - let's call it `f` - along with the initial few arguments that `f` expects.
135-
It then returns a new function that takes any other arguments that `f` still needs, and calls `f` when it receives them.
132+
์ด ๊ธฐ๋Šฅ์€ ๊ทธ ์ž์ฒด๋งŒ์œผ๋กœ๋„ ํ›Œ๋ฅญํ•˜์ง€๋งŒ, ์กฐ๊ธˆ ๋” ์ •๊ตํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋„ ๋น›์„ ๋ฐœํ•ฉ๋‹ˆ๋‹ค.
133+
์˜ˆ๋ฅผ ๋“ค์–ด,[ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ถ€๋ถ„์ ์œผ๋กœ ์ ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”](https://en.wikipedia.org/wiki/Partial_application) `partialCall` ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค.
134+
`partialCall`์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. - `f`๊ฐ€ ์˜ˆ์ƒํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ธ์ˆ˜์™€ ํ•จ๊ป˜ `f`๋ผ๊ณ  ์ง€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
135+
๊ทธ ํ›„, `f`๊ฐ€ ์—ฌ์ „ํžˆ ํ•„์š”๋กœ ํ•˜๋Š” ๋‹ค๋ฅธ ์ธ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ , ๊ทธ๊ฒƒ์„ ๋ฐ›์„ ๋•Œ `f`๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
136136

137137
```js
138138
function partialCall(f, ...headArgs) {
139139
return (...tailArgs) => f(...headArgs, ...tailArgs);
140140
}
141141
```
142142

143-
TypeScript 4.0 improves the inference process for rest parameters and rest tuple elements so that we can type this and have it "just work".
143+
TypeScript 4.0์€ ๋‚˜๋จธ์ง€ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค๊ณผ ํŠœํ”Œ ์›์†Œ๋“ค์— ๋Œ€ํ•œ ์ถ”๋ก  ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐœ์„ ํ•˜์—ฌ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ณ  "๊ทธ๋ƒฅ ๋™์ž‘"ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
144144

145145
```ts
146146
type Arr = readonly unknown[];
@@ -153,7 +153,7 @@ function partialCall<T extends Arr, U extends Arr, R>(
153153
}
154154
```
155155

156-
In this case, `partialCall` understands which parameters it can and can't initially take, and returns functions that appropriately accept and reject anything left over.
156+
์ด ๊ฒฝ์šฐ, `partialCall`์€ ์ฒ˜์Œ์— ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ํ•  ์ˆ˜ ์—†๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํŒŒ์•…ํ•˜๊ณ , ๋‚จ์€ ๊ฒƒ๋“ค์€ ์ ์ ˆํžˆ ์ˆ˜์šฉํ•˜๊ณ  ๊ฑฐ๋ถ€ํ•˜๋Š” ํ•จ์ˆ˜๋“ค์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
157157

158158
```ts
159159
// @errors: 2345 2554 2554 2345
@@ -172,23 +172,23 @@ const f1 = partialCall(foo, 100);
172172

173173
const f2 = partialCall(foo, "hello", 100, true, "oops");
174174

175-
// This works!
175+
// ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!
176176
const f3 = partialCall(foo, "hello");
177-
// ^?
177+
// ^ = const f3: (y: number, z: boolean) => void
178178

179-
// What can we do with f3 now?
179+
// f3์œผ๋กœ ๋ญ˜ ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?
180180

181-
// Works!
181+
// ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!
182182
f3(123, true);
183183

184184
f3();
185185

186186
f3(123, "hello");
187187
```
188188

189-
Variadic tuple types enable a lot of new exciting patterns, especially around function composition.
190-
We expect we may be able to leverage it to do a better job type-checking JavaScript's built-in `bind` method.
191-
A handful of other inference improvements and patterns also went into this, and if you're interested in learning more, you can take a look at [the pull request](https://github.com/microsoft/TypeScript/pull/39094) for variadic tuples.
189+
๊ฐ€๋ณ€ ์ธ์ž ํŠœํ”Œ ํƒ€์ž…์€ ํŠนํžˆ ๊ธฐ๋Šฅ ๊ตฌ์„ฑ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋งŽ์€ ์ƒˆ๋กœ์šด ํฅ๋ฏธ๋กœ์šด ํŒจํ„ด์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
190+
์šฐ๋ฆฌ๋Š” JavaScript์— ๋‚ด์žฅ๋œ `bind` ๋ฉ”์„œ๋“œ์˜ ํƒ€์ž… ์ฒดํ‚น์„ ๋” ์ž˜ํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.
191+
๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ถ”๋ก  ๊ฐœ์„  ๋ฐ ํŒจํ„ด๋“ค๋„ ์—ฌ๊ธฐ์— ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ฐ€๋ณ€ ์ธ์ž ํŠœํ”Œ์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด, [the pull request](https://github.com/microsoft/TypeScript/pull/39094)๋ฅผ ์ฐธ๊ณ ํ•ด๋ณด์„ธ์š”.
192192

193193
## Labeled Tuple Elements
194194

0 commit comments

Comments
ย (0)