|
| 1 | +## Ужесточение правил вывода типов |
| 2 | + |
| 3 | +В некоторых случаях выводу типов приходится выбирать наиболее уместный _шаблон_ своих действий. |
| 4 | + |
| 5 | +`````ts |
| 6 | +declare function mergeRandom<T> ( x: T, y: T ): T; |
| 7 | + |
| 8 | +/** |
| 9 | + * function mergeRandom<[number, boolean, string]>(x: [number, boolean, string], y: [number, boolean, string]): |
| 10 | + * [number, boolean, string] |
| 11 | + * |
| 12 | + * a: number, b: boolean, c: string |
| 13 | + */ |
| 14 | +let [a, b, c] = mergeRandom([100, true, `🙂`], [500, false, `🤩`]); |
| 15 | + |
| 16 | +let a0 = [100, true, `🙂`]; // let a0: (string | number | boolean)[] |
| 17 | +let a1 = [500, false, `🤩`]; // let a1: (string | number | boolean)[] |
| 18 | + |
| 19 | +/** |
| 20 | + * function mergeRandom<(string | number | boolean)[]>(x: (string | number | boolean)[], y: (string | number | |
| 21 | + * boolean)[]): (string | number | boolean)[] |
| 22 | + * |
| 23 | + * d: string | number | boolean, e: string | number | boolean, f: string | number | boolean |
| 24 | + */ |
| 25 | +let [d, e, f] = mergeRandom( a0, a1 ); |
| 26 | +````` |
| 27 | + |
| 28 | +Пример выше иллюстрирует, как выводу типов, помимо выбора между принадлежностью к кортежу или массиву, в стлучае с кортежем приходится прибегать к анализу его элементов. В случае неопределенности, как в примере ниже, вывод типов рассматривал элементы, как принадлежащие к типу `any`, что понижало типобезопасность программ. |
| 29 | + |
| 30 | +`````TS |
| 31 | +declare function f<T> ( p?: T ): T; |
| 32 | + |
| 33 | +/** |
| 34 | + * (раньше) Ok |
| 35 | + * [a: any, b: any, c: any] = function f<[any, any, any]>(p?: [any, any, any] | undefined): [any, any, any] |
| 36 | + * |
| 37 | + * (теперь) Error -> Type 'unknown' must have a '[Symbol.iterator]()' method that returns an iterator.(2488) |
| 38 | + * |
| 39 | + * function f<unknown>(p?: unknown): unknown |
| 40 | + */ |
| 41 | +let [a, b, c] = f(); |
| 42 | +````` |
| 43 | + |
| 44 | +Начиная с текущей версии, вывод типов больше не прибегает к алгоритмам выбора наиболее подходящего паттерна, а вместо этого выбрасывает при подобных сценариях ошибку, принуждающую к более типобезопасному явному указанию типов. |
| 45 | + |
| 46 | +`````ts |
| 47 | +declare function f<T> ( p?: T ): T; |
| 48 | + |
| 49 | +let [a, b, c] = f<[number, boolean, string]>(); // a: number, b: boolean, c: string |
| 50 | +````` |
0 commit comments