J'essaie de resserrer mon code TS en utilisant un ensemble de règles lint plus strictes, mais je me débats avec ce qui devrait être des utilisations légitimes du dynamisme.
Je suis en train de faire une garde de type pour détecter si quelque chose est itérable (pour l'envelopper dans un tableau si ce n'est pas le cas), et je n'ai aucune idée de ce qu'il faut dire à TS autre que de supprimer la règle de lint pour dire que c'est kosher :
function isIterable(obj: any): obj is Iterable<unknown> {
return obj && typeof obj[Symbol.iterator] === 'function';
}
J'ai essayé de changer ceci en :
function isIterable(obj: undefined | {[Symbol.iterator]?: unknown}): obj is Iterable<unknown> {
return !!obj && typeof obj[Symbol.iterator] === 'function';
}
qui se compile sans utiliser any
mais ce n'est pas utile, car je veux lui passer des valeurs de type inconnu.
Existe-t-il une manière "propre" de dire "oui, je veux vraiment m'appuyer sur le retour de JS" ? undefined
pour accéder à une propriété qui n'existe pas sur un objet" ? Surtout que c'est un peu l'intérêt d'écrire des protections de type.