angular / angular/components

bug(drag-drop): Wrong type assumed for dropped item in CdkDropList's cdkDropListEntered (alias for "entered")

Ouverte
#29,212 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub
area: cdk/drag-drop P4
Langage dominant
TypeScript
Étoiles
25k
Forks
6.8k
Merge moyen
1 j 8 h
PR mergées (30 j)
91

Description

### Is this a regression?

- [ ] Yes, this behavior used to work in the previous version

### The previous version in which this bug was not present was

_No response_

### Description

I'm facing an issue where Typescript won't allow me to use strongly typed version of `CdkDragEnter`. In a service I have a method with defined types for `CdkDragEnter`'s item and container data.

https://github.com/angular/components/blob/main/src/cdk/drag-drop/directives/drop-list.ts#L138

`CdkDropList`'s `entered` is typed like this: `EventEmitter>` which results in `CdkDragEnter`'s 2nd type argument assuming the same type as the 1st argument. That way it won't allow me to define two different types for the container's and the item's data.

### Reproduction

StackBlitz link:
Steps to reproduce:
1. define an element in template
2. add `cdkDropList` directive
3. add arbitrary data to `cdkDropListData` directive
4. add `(cdkDropListEntered)="onDropListEnter($event)` to react to the event
5. define `onDropListEnter` liks this:
```ts
onDropListEnter(event: CdkDragEnter) {
this.dropListEnterEvent.emit(event);
}
```

### Expected Behavior

Typing for `entered` Event Emitter allows different types between item and container data.
This is already the case for the `dropped` Event Emitter which is typed like this: `EventEmitter>`
So I'm guessing that this could already be a possible solution?

### Actual Behavior

`$event` in `(cdkDropListEntered)="onDropListEnter($event)` gets highlighted in red and build fails because `The types of 'container.data' are incompatible between these types.`

### Environment

Angular CLI: 17.3.3
Node: 20.11.0
Package Manager: npm 10.2.4
OS: darwin arm64

Angular: 17.3.4
... animations, common, compiler, compiler-cli, core, forms
... localize, platform-browser, platform-browser-dynamic, router

Package Version
---------------------------------------------------------
@angular-devkit/architect 0.1703.3
@angular-devkit/build-angular 17.3.3
@angular-devkit/core 17.3.3
@angular-devkit/schematics 17.3.3
@angular/cdk 17.3.3
@angular/cli 17.3.3
@schematics/angular 17.3.3
rxjs 7.8.1
typescript 5.3.3
zone.js 0.14.4

Guide de contribution

Ouvrir le guide de contribution

Piste de recherche

Commencez dans src/cdk/drag-drop/directives/drop-list.ts vers la ligne 138 et examinez le type de l’EventEmitter entered ainsi que les paramètres génériques de CdkDragEnter et l’emitter dropped. C’est terminé lorsqu’un handler cdkDropListEntered peut utiliser des types différents pour les données du conteneur et les données de l’élément glissé, et que l’exemple de l’issue compile.

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

Évaluation

Stack technique
angular, typescript
Domaine
frontend
Type d'issue
Bug
Difficulté
2/5
Temps estimé
1-3 heures
Activité
À l'abandon
Clarté
Clairement spécifiée
Accessibilité débutants
48/100

Recevez les nouvelles issues par e-mail

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