Il n'y a pas si longtemps, j'ai déniché un référentiel de type-challenges sur les espaces ouverts de GitHub . J'ai tout un blog où je résous des problèmes à partir de là, mais aujourd'hui, je vais essayer de montrer non seulement la mise en œuvre Get
, mais aussi de démontrer les problèmes courants, de montrer les améliorations et l'utilisation en production.
Si vous souhaitez vous familiariser avec les concepts TypeScript requis dans cet article avant de lire, passez à la fin.
De plus, cet article est la traduction d'un article que j'ai écrit en anglais. Si vous êtes intéressé, allez-y .
1. Mise en œuvre de base
, ( )
?
1.1.
, JavaScript:
, keys.reduce
, . JavaScript split
. TypeScript - .
TypeScript 4.1, Template Literal types. . Path
:
. , ( ). Playground. :
. Playground.
1.2. Reducer
, , - keys.reduce
. , GetWithArray
, K
:
K extends [infer Key, ...infer Rest]
,
Key extends keyof O
O[Key]
( Playground). , . :
1.3.
, : Playground. , .
2.
production, , . ?
, null
undefined
.
: Playground. , TypeScript .
. - :
, undefined
or null
. .
2.1. undefined, null
3 :
, undefined
/ null
union type, , . "" .
, , Playground
2.2. reducer
GetWithArray
:
,
undefined
/null
, (
undefined
)
, ( Playground).
3.
:
JavaScript :
, string
number
, Path
:
3.1. Reducer
, keys.reduce
. TypeScript GetWithArray
. , GetWithArray
.
. A
O
:
Playground, :
string
:
'1' extends keyof string[]
,never
.
readonly
(
[0, 1, 2]
)never
undefined
:
.
3.2. T | undefined
T | undefined
( , ), T
:
A extends readonly (infer T)[]
, .. ( readonly
) .
, . Playground.
3.3.
, , ( undefined
)
, , extends
( ExtendsTable
) , :
4 :
[0]
number[]
readonly number[]
any[]
, , :
|
|
|
|
|
|
|
✅ |
✅ |
✅ |
✅ |
|
❌ |
✅ |
✅ |
✅ |
|
❌ |
❌ |
✅ |
❌ |
|
❌ |
✅ |
✅ |
✅ |
✅ , , . :
[0] extends [0]
number[] extends readonly number[]
, ❌, , . :
number[] extends [0]
readonly number[] extends number[]
any[]
: [0]
❌, () – ✅.
, !
any[] extends A
GetWithArray
:
any[] extends A
T | undefined
, ,
,
undefined
, Playground.
4.
:
:
: ExtractFromObject
ExtractFromArray
, , , :
ExtractFromObject
–O extends Record<PropertyKey, unknown>
. ,O
ExtractFromArray
:A extends readonly any[]
GetWithArray
:
. Playground.
5. JavaScript
JavaScript:
lodash
, get
. common/object.d.ts @types/lodash
, . get
any
: typescript-lodash-types
reduce
for
( for-of
), , undefined
null
:
get
, . :
Get
,
- (, )
. Get
:
Summary
TypeScript:
TypeScript 1.3, (Variadic Tuple Types) 4.0, spread
(Conditional types) TypeScript 2.8
infer
, TypeScript 2.8
(Recursive conditional types) TypeScript 4.1
(Template Literal types) TypeScript 4.1
(?) (Generic Constrains)
-
Merci à tous pour votre attention. Si vous avez des suggestions, écrivez dans les commentaires. Passez une bonne soirée et un week-end à tous.