typescript - Deklarer TypedArray med ArrayLike?


Jeg lette etter en måte å deklarere generiske TypedArray-typer i en d.ts-fil. TypedArray ser ikke ut til å eksistere av en eller annen grunn, men jeg kom over en kommentar et sted som foreslo å bruke ArrayLike<T>. Ville dette fortsatt være den beste løsningen?

Jeg kan gjette hva ArrayLike er, men finnes det noen dokumentasjon for det? Å googling og søke på Typescript-nettstedet gir ikke mye.

REDIGER: Jeg la nettopp merke til at konstruktører for typed arrays er deklarert til å ta en ArrayLike som første parameter, så det vil indikere at dette er den riktige måten å gå frem på.

Svar #1

Jeg er ikke sikker på om jeg forstår spørsmålet ditt riktig, men følgende instansieringer fungerer i TypeScript 1.6 (den siste stabile versjonen på tidspunktet for skriving):

let t01 = new Uint8Array([1, 2, 3, 4]);
let t02 = new Int8Array([1, 2, 3, 4]);  
let t03 = new Uint8Array([1, 2, 3, 4]);
let t04 = new Uint8ClampedArray([1, 2, 3, 4]);
let t05 = new Int16Array([1, 2, 3, 4]);
let t06 = new Uint16Array([1, 2, 3, 4]);
let t07 = new Int32Array([1, 2, 3, 4]);
let t08 = new Uint32Array([1, 2, 3, 4]);
let t09 = new Float32Array([1.5, 2.5, 3.5, 4.5]);
let t10 = new Float64Array([1.5, 2.5, 3.5, 4.5]);

let arrayBuffer = new ArrayBuffer(16);

(TypeScript-lekeplass med det forrige skriptet, MDN-dokumentasjon)

Du kan se at typede arrays er i es6.d.ts-filen:

/**
  * A typed array of 8-bit integer values. The contents are initialized to 0. If the requested 
  * number of bytes could not be allocated an exception is raised.
  */
interface Int8Array {
    /** 
      * Returns an array of key, value pairs for every entry in the array
      */
    entries(): IterableIterator<[number, number]>;
    /** 
      * Returns an list of keys in the array
      */
    keys(): IterableIterator<number>;
    /** 
      * Returns an list of values in the array
      */
    values(): IterableIterator<number>;
    [Symbol.iterator](): IterableIterator<number>;
}

Er dette det du er ute etter?

REDIGER:

lib.es6.d.ts definerer ArrayLike (se definisjonen av hva som er Array-lignende i JavaScript) som:

interface ArrayLike<T> {
    length: number;
    [n: number]: T;
}

og Iterable som

interface Iterable<T> {
    [Symbol.iterator](): Iterator<T>;
}

Slik defineres en funksjon som ligner veldig på din:

interface Uint8ArrayConstructor {

    //
    // ...
    // 

    /**
      * Creates an array from an array-like or iterable object.
      * @param arrayLike An array-like or iterable object to convert to an array.
      * @param mapfn A mapping function to call on every element of the array.
      * @param thisArg Value of 'this' used to invoke the mapfn.
      */
    from(arrayLike: ArrayLike<number> | Iterable<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Uint8Array;
}

så jeg vil definere funksjonen din som:

function foo(arrayLike: ArrayLike<number> | Iterable<number>) { ... }

Relaterte artikler