CesiumGS / CesiumGS/cesium

`ImageryProvider#getTileCredits` excludes the valid `undefined` result from `Google2DImageryProvider`

Open Beginner friendly
#13,630 1 comment 0 reactions 0 assignees View on GitHub
needs triage type - bug
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.