microsoft / microsoft/TypeScript

Generic TypedArray constructors have only one overload

Offen
#61,680 3 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Domain: lib.d.ts Help Wanted Possible Improvement
Vorherrschende Sprache
Go
Sterne
111k
Forks
14.3k
Ø Merge
2 T. 4 Std.
Gemergte PRs (30 T.)
132

Beschreibung

### 🔎 Search Terms

Uint8Array

### 🕗 Version & Regression Information

- This is the behavior in versions 5.8.3 and 5.7.3
- I was unable to test this on prior versions because `Uint8Array` is not generic in earlier versions

### ⏯ Playground Link

https://www.typescriptlang.org/play/?target=11&ts=5.8.3#code/MYewdgzgLgBBIFcBOwCmMC8MyoO4wFUBLMKADgEEkkBDATwAoBGABgEoBuAKC9EllAAHOk0zY8hEuSq1G8ZGk69w0GELoAmMTnzFSlavQA8M+gCEEAM0uokAGSIBrVAD4G8lKiV9V6gMzaEnrShnQmoRbWtm4eitxAA

### 💻 Code

```ts
const source = new Uint8Array(10);

const copy1 = new Uint8Array(source); // OK
const copy2 = new Uint8Array(source); // TS 2345
const copy3 = new Uint8Array(source); // TS 2345
```

### 🙁 Actual behavior

Only the generic constructor overload of `Uint8Array` is available when using `Uint8Array` with a generic parameter, i.e. the one which accepts a `TArrayBuffer` as the first argument. It is therefore not possible to pass a `Uint8Array` as the first argument without a compile error, even though this is valid.

### 🙂 Expected behavior

It should be possible to use all the valid overloads of `Uint8Array` (and friends) constructor without a compiler error.

### Additional information about the issue

This seems to only affect `target` value of `ES2024` or `ESNext`, but I can't figure out why from looking at the types.

I assume this behaviour occurs for the same reason as given in [this comment](https://github.com/microsoft/TypeScript/issues/60745#issuecomment-2538876758). In that case I assume the fix would be adding copies of all the constructor overloads to the `Uint8ArrayConstructor` interface, but with type parameters.

For example, the following works ([TS Playground](https://www.typescriptlang.org/play/?target=11&ts=5.8.3#code/JYOwLgpgTgZghgYwgAgKqjADgIJSnATwGEB7EAZzCgFcEwSpkBvAKGXeQHpPkwALYOWSDkAK2qVkcZAhIAHAshIxkEAB6CwoAOZKAbtAA2JOABNyAGmQB3YP2QADACq58BAELUYMaA+Ry4fABbKVNTCFM2DhAIa2QAHhc8Qk9vaFU1SBBzZFcUrx8oABlgAGsUAF5c5I8C6AA+AAoojmRDCBBtfgAuZBBqIIAjaAsW5ABKXvRwHBrEvNq0qHqAbjGYuPma1MKMrJyFnegS8uQqw7rl5tb2QLdehZOIeP6hhtHWybQMWbcttyOyzWrQ2CSSAMuew6B22lyeZ2qEKWTTG7EGlwesKWHxugwIkAA8t5yBAwAB+XqvYZQHGtdqdfgUvoDam0iZTH4Lf75ZHA6KxMEXJZQ7JCIWFeHnLGFFE3KQ1TFuJ4vFkNZAAH0RPMKbK+0ywXPB2oaawAviwWLIKGBkOQSNQoEgEaD9b9CI0AIwABnGa0tZEksgUHudAtdC0adodSF9-utMnkBAATKG4uG5uLjmUIE0o46ILGrYHEwBmVPfGZczNXPMxtZAA)):

```ts
interface Uint8ArrayConstructor {
// this is just a copy of existing overloads, with `TArrayBuffer` param added
new (
length: number,
): Uint8Array;
new (
array: ArrayLike,
): Uint8Array;
new (
buffer: ArrayBuffer,
byteOffset?: number,
length?: number,
): Uint8Array;
new (
array: ArrayLike | ArrayBuffer,
): Uint8Array;
}

const source = new Uint8Array(10);

const copy1 = new Uint8Array(source);
const copy2 = new Uint8Array(source);
const copy3 = new Uint8Array(source);
```

I think this is basically the opposite problem to that which was fixed by #60934.

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne mit dem verknüpften TypeScript Playground und vergleiche das Verhalten des Uint8Array-Konstruktors unter ES2024 und ESNext. Prüfe die im Issue beschriebenen generischen Uint8Array-Konstruktor-Deklarationen und verifiziere anschließend, dass die Beispiele für die length-, array-like- und buffer-Überladungen mit expliziten Typargumenten kompiliert werden.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
typescript
Bereich
compilers
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
42/100

Neue Issues direkt in Ihr Postfach

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