Skip to content

Intellisense provides different suggestions on autocomplete when using indexed access or dotted access #56096

@alexandercerutti

Description

@alexandercerutti

🔎 Search Terms

"autocomplete suggestions intellisense differences between indexed access and dotted access"
"indexed access vs dotted access suggested properties"

🕗 Version & Regression Information

  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about

I tested it in TS Playground with Nightly and TS 5.2.

⏯ Playground Link

https://www.typescriptlang.org/play?ts=5.3.0-dev.20231013#code/PQKhCgAIUhxB5AggGQFyQOYEsBuBTAO0gEMjCBXAW0gHsAzSABxoGcWsAjAGz0j3wIAXFgBpIAd17jSgyIJpQYxNlgxEWNSr36FZjYgE8uNYgBM5Bxr3mQNW2g0EALbQOEA6RZC8AVF5AAnPBZZFicaci5zDDxZYkxCPACsAGNIACIAUTd0pkNjMxIVNTxTT2hIAHU8MWdCMTCIqMgOXmJuaxpILQCYlppnOX8QgPIUwXIgli9Sc1aSDsgsIjpyAnGsGgIWIeJZchZeGIIk1J2uLABraycsHa3eVuNxLxsaDkFiZaHefSMTcwhYgBQTLDCQOgBTQ-PhuCxWcogYDgcCmPApLjA3irdagrYQrBcQRJADCB3klGyugACvkAQAxGgBKlCAA8Pj4AA9iQRTDsSdSWcIAHwACjoTKF6B8AEp0PAOIcAjh2jxWQKhSwALLERgAbR8AF1hSjQBAKlqsJRUpcwYFOQArHY2Yg4GhYcxoqy8wgpAxLSjMEGKZHgQSWXgKpUqjqsgAawsgAF5IABvcAASBY5EVKWSrVFcsgUaSMbVCfAAF8ANymsCQZCxADkO1a2CISJRFGoGrcO3TGZJyAAkiSANLJjIYm3pESZ6nIRAATUn6UYmIMs8zJMQADkF8vVylSOvDFuMwel8Pd7BV6eDGDz9TEABVADKmTvxAOeHPmQASv+8D-quSRQgEf67gAIpkUGgT6pjnsgSBQW+PiIP+HIpukBSmG+nwgue-6ID4mQkgAEnusCfthAR7OiTikDE56VIgw4+Net7YdIWCggQGDnh+mRjpxq6HHgtr8YJmTCbBYl4BJpTnhxWqZC+1JQSRNEZKCWjkIwpj0eeABq8DIC+qkUVR2npG6XBUAxTG-nOGZQS+xEcfAu5WTeNmmJMeybOsjH8c5maIFBUE+MR46rmYpiCHRKSXH+WpvlxGR4JQLACS5l4AEKIOOAD6+WZLA17FZRyCkXB2H3hwxDJfleDtuRxBEkpLloRhPjFSpmTFYgxlsYu+XIDZQIgj4Vp4IgKqEqqYWDl5pG7n1PWkcVPnUXVU5bDygj4fRJIhTEiEua+UHDvAxWXsV-7DrA5F9UVACKL7Dv+cnYd+pibNSG7-qoTiCIgKQAI7kFgQQXZmm1vsV6maaRYmfMIL4GUZc6VqawCQLS-xmDsjH4C0ClEEEp4pKUEJMjCVNQgAtMehxiBw5CyHU-qmF0BADN0ezEgEgQg7I-PiJ4yzC3QTW8AKOqMFYpiammmZ6r2ugsO4mRpbAhroGslwSwQ1beBmGuCn27huR5N3eZRvkG5ARsm7WFua0I2umeZlmO9RzuuzQ4im+rnseANyNaYHBDG8Hoce1bWs64BwEx3HIfu5bmruB5ZH+5k6du2HSde+4EVRTFY5F-HWfh9rJKrZk63FZtg07bBNeZyXOc9Zh-XDqpQ0jcOY0TV3CfZ9bBVFWOpXlZV1W1RPdelx4CNIxp0eG7HxeJznV03Xdi5Lg9T0vUNJIfV9nc7xnk-1+4QkiTeK899bz+3y7u+11WdbmjAPwdwliiAcJAFIEQAhsxhCwYg9h6BeC8AAAxQV4f86ImSmFZJkTkGJyBonVGvUB1wDD0EgArXUytNTCjEEKE0FQUFIJDCicMVhyHUhfAQSglDSiqxTAOPUE5vg4LwQQ+uYgSFkIoUrXhfZhTOyFLWGsXZORBi5hGdhmpFaTmkVQvskAABk7DOHcJkSrPstZwB4FUUydRbCBQlmVEtPhasLZCKIJIhg9dFbO0cWWPAhCtG6kEcaJRlizReEbIIFs4Cgj0VoJMWgHAHTolkOIXiTgEki1MYwMEXhWiCEkIQPgBAqCQBITsWYSToxLW1sw1E6JMRBHAVsEIsJdB+NqegBxipSzOIsf-Lwu5g60G9DCaWeAuAXEONsXg+NvzyAgYGHgeIiBaFKbQIgzhgHWMYFMdg+IOA83dPxfozhUCIIYagioOghCdI6HUq5TCKgzF5JcmAjCvC3MEPcngLA9TpHSIaZBKCAAF7zvAVD8NoVRqTaZTEiLIYBzg9hLC5i4f0jRIjmD2TQHAHprDiC6P9OgdAki6C8NmXpwgwEpHCKkYIkBRTEhCLTdJgxdxiy4P6fE8BxiQAAIwAGYZT1O+b84IgyKj5RfD4MQWAGDDkgLzEgKQaZsCGFCcgGBMm80EMScwTV1XOi6PEXFVgQT+hRUinY-NQjapiKy0wc4Ki8RAYEDBagsAAC9abKEgCqC4hreQSEmVweEpREShnFb0pxDz3ANSapcFqbUOoGvAMAfGkBs05tzXmyAAA9AA-FKwBtwdh3HldsYkZgxBBAgV631ZRIDQuaeJbKchTVKyxEIbl5NNl9oeMqhVZKgjrBuHsLw1odWyHmHUcpeAeWOH8LijolB0DmqSOGBdBhKnNPrTQRtfqdgktHboKNXY3ASu1voH8Gas35sfdm4tLCNFjkXSweAdAhTXsnJ4iNZCY01IebWTNuaX2luLAwCBkxoFGuCOwU5zgtU6pKWUip7qQiEnDYGj0F7wAQOrZATkk5RRAb6Q8qeycZ4lTKhVXcVUUDLxlKBh9haS0EdabIf0KYyNXtjf4-5j9nzvkLix+94Gi1AA

💻 Code

/**
 * Mimicking rxjs to avoid dependency import
 */

type Observable<X> = {
	subscribe(): Observable<X>
};

enum CPEvents {
	CLICK = "click",
	PLAY = "play",
	CANPLAY = "canplay",
	PLAYING = "playing",
	PAUSE = "pause",
	ERROR = "error",
	ENDED = "ended",
	LOADSTART = "loadStart",
	RATECHANGE = "ratechange",
	WAITING = "waiting",
	SEEKING = "seeking",
	SEEKED = "seeked",
	TIMEUPDATE = "timeupdate",
	VOLUMECHANGE = "volumechange",
	DURATIONCHANGE = "durationchange",
	ADDTRACK = "addtrack",
	EMSG = "emsg",
	PLAYBACK_BEGIN_HALTED = "playbackBeginHalted",
	START_TIME_AVAILABLE = "startTimeAvailable",
	CONTENT_STATE_CHANGED = "contentStateChanged",
	AUDIO_PLAY_RIGHT_ACQUIRED = "audioPlayRightAcquired",
	STATS_UPDATE = "statsUpdate",
}

// Payloads have been replaced for the repro-case, but they do not matter right now.
interface CPMappedEvents {
	[CPEvents.EMSG]: unknown; 
	[CPEvents.DURATIONCHANGE]: unknown;
	[CPEvents.VOLUMECHANGE]: unknown;
	[CPEvents.TIMEUPDATE]: unknown;
	[CPEvents.ERROR]: unknown;
	[CPEvents.RATECHANGE]: unknown;
	[CPEvents.ADDTRACK]: unknown;
	[CPEvents.CONTENT_STATE_CHANGED]: unknown;
	[CPEvents.START_TIME_AVAILABLE]: unknown;
	[CPEvents.PLAYBACK_BEGIN_HALTED]: unknown;
	[CPEvents.STATS_UPDATE]: unknown;
	[CPEvents.AUDIO_PLAY_RIGHT_ACQUIRED]: unknown;
	[CPEvents.SEEKING]: unknown;
	[CPEvents.SEEKED]: unknown;
}

type CPUnmappedEvents = {
	[K in Exclude<CPEvents, keyof CPMappedEvents>]: Event;
};

export type CPEventsMap = CPMappedEvents & CPUnmappedEvents;

export type CPObservableEvents = {
	[K in keyof CPEventsMap]: Observable<CPEventsMap[K]>;
};

declare const eventObservables: CPObservableEvents;

🙁 Actual behavior

Intellisense (autocomplete) suggests two different subset of valid values when accessing a mapped object through dotted access and indexed access, but accessing with a dotted access to an unsuggested (available in indexed access and there fore still valid) property seems to be still valid and well-recognized.

🙂 Expected behavior

The suggested values should be the same if there is not a specific indexed signature.

Additional information about the issue

No response

Metadata

Metadata

Labels

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions