angular / angular/components

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

Offen
#29,212 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
area: cdk/drag-drop P4
Vorherrschende Sprache
TypeScript
Sterne
25k
Forks
6.8k
Ø Merge
1 T. 8 Std.
Gemergte PRs (30 T.)
91

Beschreibung

### 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

Beitragsleitfaden

Beitragsleitfaden öffnen

Rechercherichtung

Beginne bei src/cdk/drag-drop/directives/drop-list.ts ungefähr in Zeile 138 und untersuche den Typ des entered EventEmitter zusammen mit den generischen Parametern von CdkDragEnter und dem dropped-Emitter. Fertig ist es, wenn ein cdkDropListEntered-Handler unterschiedliche Typen für Containerdaten und Drag-Item-Daten verwenden kann und das Beispiel im Issue kompiliert.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
angular, typescript
Bereich
frontend
Issue-Typ
Bug
Schwierigkeit
2/5
Geschätzter Aufwand
1-3 Stunden
Aktivitätsstatus
Veraltet
Klarheit
Klar beschrieben
Anfängerfreundlichkeit
48/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.