The closed field is a real <input type="text"> carrying role="combobox", with aria-expanded, aria-haspopup="listbox" and aria-autocomplete="list". That part is Select's, and TreeSelect shares it unchanged.
What opens is not a listbox. It is a tree, and the roles inside the popup are the ones a tree is supposed to have:
- The scrolling list is role="tree" and carries its own aria-activedescendant.
- Each row is role="treeitem" with aria-expanded (omitted on a leaf), aria-selected, aria-checked and aria-disabled.
- A checkbox, when treeCheckable is on, is a separate role="checkbox" node pointed at the row's title with aria-labelledby.
- An empty result is a role="listbox" div holding notFoundContent, which is the one place the popup keeps Select's role.
The combobox and the tree are not joined up, and you cannot join them from outside. The input's aria-controls and aria-owns point at ${id}_list, an id that only Select's own option list creates. TreeSelect replaces that list, so the attribute resolves to nothing, and the input never gets an aria-activedescendant. Treat this as a limitation to work around in the page, not as something a prop fixes.