Yet another attempt at typed JS data

Andrea Giammarchi andrea.giammarchi at gmail.com
Fri Feb 7 16:33:33 UTC 2020


As more and more often devs are shifting into TS, or would like to have
dynamic typed arrays without a fixed length, and as v8 and likely other
engines too optimize a lot for same-kind arrays, I wonder what people here
think about this `TypedArray` rough proposal:

# Signature:

```js
new TypedArray(
  type,   // either a "type" to infer, or a shape, or a Class
  length  // optional: if defined it's fixed size
);
```


## About the `type`

  * if the inferred type is `object`:
    * if the object is `null`, throw new InvalidType
    * if the object is a literal, or its `__proto__` is either `null` or
`Object.prototype, enforce own properties and respective types
    * if the object is not literal, fallback to object Class (`/./` is
`RegExp`, `() => {}` is `Function`, etc)
  * if the inferred `type` is `function`, fallback to Class
  * if the inferred `type` is `Class`, ensure each entry is an instance of
such class, or throw InvalidType
  * in every other case, make a _typed_ collection of `number`, `string`,
`boolean`, or `symbol`


## About the `length`

  * if provided, the collection has a fixed, immutable, length, and each
initial entry a default value


# Use Cases:

```js
const numbers = new TypedArray(0, 5);
// creates [0, 0, 0, 0, 0]
// numbers length is immutable
// numbers accepts only typeof number
// out of bound entries throw

let numbers = new TypedArray(0);
// numbers length is dynamic
// numbers accepts only typeof number
// out of bound entries throw

const shapes = new TypedArray({name: '', age: 0}, 3);
// creates [{name: '', age: 0}, {name: '', age: 0}, {name: '', age: 0}]
// shapes length is immutable
// shapes accepts only objects with `name` and `age` and respective types
// out of bound entries throw

let shapes = new TypedArray({lat: 0, long: 0});
// shapes length is dynamic
// shapes accepts only objects with `lat` and `long` and respective types
// out of bound entries throw

const classes = new TypedArray(HTMLElement, 2);
// creates [Object.create(HTMLElement.prototype),
Object.create(HTMLElement.prototype)]
// classes length is immutable
// classes accepts only instances of HTMLElement
// out of bound entries throw

let classes = new TypedArray(HTMLElement);
// classes length is dynamic
// classes accepts only instances of HTMLElement
// out of bound entries throw

// more options
let strings = new TypedArray('');
let booleans = new TypedArray(true);
let functions = new TypedArray(Function);
let coords = new TypedArray({lat: 0, long: 0});
```

Thanks in advance for eventual thoughts on this 👋
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20200207/166b3b3d/attachment.html>


More information about the es-discuss mailing list