Improve support for Symbol.toPrimitive
See original GitHub issuePresently, TS limits index types to ‘string’, ‘number’, ‘symbol’, or ‘any’. That’s fine, but consider the following:
class Foo {
[Symbol.toPrimitive](): number {
return 1;
}
}
var x = ['a','b','c'];
var f = new Foo();
x[f];
We give the error an index expression argument must be of type ...
on the array access.
Foo
is for all intents and purposes a wrapper around the number 1
(close to new Number(1)
), yet it cannot be used to index an array, since Foo
itself is not of type number
, string
, symbol
, or any
. We could do extra type-checking to see if an object has a user-defined Symbol.toPrimitive
and consider its return types when checking type-coercing operations (after all, if you’ve opted in to using Symbol.toPrimitve
it’s probably part of your goal to gain this behavior), such as indexing or mathematics operators.
Building on this, we currently don’t support the coercion of Number
or String
classes to their respective primitive types (which are a specialization of the above issue but which applies to ES5 and ES3 output). Presently one can’t do this:
function add(a: string, b: string): number {
var x = new Number(a);
var y = new Number(b);
return x + y;
}
add('10e4', '0x8');
Because since neither x nor y is the ‘number’ (or ‘string’) primitive type, the addition operation is not allowed. Though it’s still valid js (and without the usage of the Number class, the addition would result in ‘10e40x8’!).
Issue Analytics
- State:
- Created 8 years ago
- Reactions:15
- Comments:5 (2 by maintainers)
Top GitHub Comments
I thought I might try the hack where you intersect with a primitive. This works for alot of cases.
However I found that strings intersection results in conflicts with the main type. Especially in terms of index accessors:
So it would be nice to support some way of doing this. Although I noticed that
Date
has the same problem atm.I think this would make writing isomorphic packages that use
setTimeout
easier (https://github.com/microsoft/TypeScript/issues/842). You’d be able to assign the Timeout type to a number.