microsoft / microsoft/TypeScript

DOM: `Element#matches()` incorrectly narrows types

Ouverte
#63,497 14 commentaires 3 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Domain: lib.d.ts Help Wanted
Langage dominant
Go
Étoiles
111k
Forks
14.3k
Merge moyen
2 j 4 h
PR mergées (30 j)
132

Description

### 🔎 Search Terms

element matches narrow never

### 🕗 Version & Regression Information

- This changed between versions 5.9.3 and 6.0.3

### ⏯ Playground Link

https://www.typescriptlang.org/play/?ts=6.0.3#code/CYUwxgNghgTiAEEQBd4iQWxAO2QLngAkAVAWQBkBRTHZAbgCgBCdELXAOgymTAAsQAZwAU8AOTBkY+AEp4AMnloanbrwEjxwYNJlA

### 💻 Code

```ts
declare let element: HTMLElement;
!element.matches( 'dt' ) && element.matches( 'dd' )
```

### 🙁 Actual behavior

`element.matches( 'dd' )` throws a `Property 'matches' does not exist on type 'never'` compilation error.

### 🙂 Expected behavior

`element.matches( 'dd' )` does not throw any error.

### Additional information about the issue

`element.matches( 'dt' )` uses the following overload:
```ts
matches(selectors: K): this is HTMLElementTagNameMap[K];
```

The return type of `element.matches( 'dt' )` is then `this is HTMLElementTagNameMap['dt']` that maps to `this is HTMLElement`.

Since `this` is `HTMLElement`:
- When false, the type of `element` is `HTMLElement` (not narrowed further).
- When false, the type of `element` is `never`.

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par l’exemple TypeScript Playground lié et examinez la surcharge de Element#matches présentée dans l’issue, puis suivez la manière dont le prédicat de type restreint HTMLElement après une vérification négative. L’issue est terminée lorsque le second appel à element.matches('dd') se compile sans l’erreur Property 'matches' does not exist on type 'never'.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
typescript
Domaine
compilers
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
Active
Clarté
Plutôt claire
Accessibilité débutants
52/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.