`ImageryProvider#getTileCredits` excludes the valid `undefined` result from `Google2DImageryProvider`
- Dominant language
- JavaScript
- Stars
- 15.7k
- Forks
- 3.9k
- Avg merge
- 4d 6h
- Merged PRs (30d)
- 34
Description
### What happened?
Hi,
Here's a small type issue I ran into while working. I then used AI to find out what was going on.
After ensuring that was correct, I had it generate this issue, reviewed it, and added a human comment or two.
## Summary
`Google2DImageryProvider` cannot be passed directly to `ImageryLayer` in TypeScript because their `getTileCredits` return types differ:
- `Google2DImageryProvider#getTileCredits`: `Credit[] | undefined`
- `ImageryProvider#getTileCredits`: `Credit[]`
This is a declaration-contract mismatch. `Google2DImageryProvider` returns `undefined` when a tile has no attribution, and `ImageryLayer` already handles that result at runtime.
## Source details
- `packages/engine/Source/Scene/Google2DImageryProvider.js` correctly documents and implements `getTileCredits` as `Credit[] | undefined`.
- `packages/engine/Source/Scene/ImageryLayer.js` checks whether the returned credits are defined before using them.
- `packages/engine/Source/Scene/ImageryProvider.js` documents `getTileCredits` as returning only `Credit[]`; the generated `@cesium/engine` declaration inherits that narrower type.
## Expected behavior
`Google2DImageryProvider` should be directly assignable wherever an `ImageryProvider` is accepted.
### Reproduction steps
With `@cesium/engine@26.0.0`:
```ts
import { Google2DImageryProvider, ImageryLayer } from "@cesium/engine";
const provider = new Google2DImageryProvider({
url: "https://tile.googleapis.com",
session: "session",
tileWidth: "256",
tileHeight: "256",
key: "",
});
new ImageryLayer(provider);
```
TypeScript rejects `provider` because `Google2DImageryProvider#getTileCredits` can return `undefined`, which is not assignable to the base `ImageryProvider` declaration's `Credit[]` return type.
## Possible Suggested fix
Update the JSDoc return type on `ImageryProvider.prototype.getTileCredits`:
```diff
- * @returns {Credit[]} The credits to be displayed when the tile is displayed.
+ * @returns {Credit[]|undefined} The credits to be displayed when the tile is displayed.
```
Happy to submit a PR for this if you think this solution is alright.
### Sandcastle example
_No response_
### Environment
Browser:
CesiumJS Version:
Operating System:
(Issue doesn't pertain to runtime behavior)
### AI acknowledgment
- [x] I used AI to generate this issue report.
- [x] (If the above is checked) I have reviewed the AI-generated content before submitting.
Contributor guide
Research direction
Start with the JSDoc for getTileCredits in packages/engine/Source/Scene/ImageryProvider.js and compare it with the implementation and documentation in Google2DImageryProvider.js and the handling in ImageryLayer.js. Update the base return type to include undefined, then verify that the generated @cesium/engine declaration allows Google2DImageryProvider wherever an ImageryProvider is accepted.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- javascript, typescript
- Domain
- api
- Issue type
- Bug
- Difficulty
- 1/5
- Estimated time
- Under an hour
- Activity status
- Quiet
- Clarity
- Clearly specified
- Newbie friendliness
- 76/100