>  That should solves all cases, right?

Only if a non `:any` type **must** extend `Typed()`. Put another way:

class MyType extends Typed {}
class OtherType {}

let a: any = new Object; //Valid
let b: OtherType; //Error: Invalid type specification
let c: MyType = new Object; //Error: Invalid cast assignment
let d: MyType = new MyType; //Valid


On Fri, Apr 5, 2019 at 3:44 AM Andrea Giammarchi <
andrea.giammar...@gmail.com> wrote:

> we could add a `Typed` primitive every typed value inherits from, similar
> way every object implicitly inherits from `Object` these days.
>
> That, by contract, would disallow any prototype related operation to
> either classes or instances, and it will simplify the
> `Reflect.isTyped(thing)` algo.
>
> class MyType extends Typed {}
> const num:i32 = 123;
>
> the `MyType` class, and every instance of it, cannot have mutated
> prototype, and so cannot the `num`.
>
> Typed values will be all shortcuts that behave like a Typed instance.
>
> That should solves all cases, right?
>
>
>
>
>
> On Thu, Apr 4, 2019 at 8:52 PM Ranando King <king...@gmail.com> wrote:
>
>> >  if we base any assumption only to the current highly dynamic nature of
>> JS we won't go too far.
>>
>> Problem is that if we infringe on the "current highly dynamic nature of
>> JS", we'll end up breaking valuable use cases. Any new feature added should
>> always be 100% compatible with the non-competing portions of the existing
>> language.
>>
>> > I think the mutable prototype issue can be solved through static
>> classes where no changes would be possible and all instances would be
>> immune to `setPrototypeOf`
>>
>> That solves half of the problem. What of the other half (`Type v =
>> "somevalue";` where `Type` is not a static class)? With your approach, that
>> would need to be restricted to solve the other half. Otherwise, you'd still
>> be facing the issues Waldemar spoke about.
>>
>> On Thu, Apr 4, 2019 at 2:49 AM Andrea Giammarchi <
>> andrea.giammar...@gmail.com> wrote:
>>
>>> If something is missing, let's move forward finding out solutions,
>>> 'cause if we base any assumption only to the current highly dynamic nature
>>> of JS we won't go too far.
>>>
>>> As example, I think the mutable prototype issue can be solved through
>>> static classes where no changes would be possible and all instances would
>>> be immune to `setPrototypeOf`
>>>
>>> ```
>>> static class MyType {}
>>>
>>> Reflect.setPrototypeOf(MyType, Array); // nope
>>> Reflect.setPrototypeOf(new MyType, []); // nope
>>> ```
>>>
>>> we'll also need a `Reflect.isTyped(ref)` in case we'd like to throw
>>> errors on prototype set attempts.
>>>
>>>
>>>
>>> On Thu, Apr 4, 2019 at 6:11 AM Ranando King <king...@gmail.com> wrote:
>>>
>>>> > - If you allow user-defined types, objects can spontaneously change
>>>> their type by mutating their prototype.  Thus, you can declare a variable x
>>>> to have type Foo and check that you're assigning an instance of Foo to it,
>>>> but the value x can become a Bar (different from a Foo) spontaneously
>>>> without any operations on x.
>>>>
>>>> At least for static typing, the engine will need to freeze a copy of
>>>> the class definition at the time when the static type is referenced. That
>>>> frozen type will be associated with the variable in a fixed way, making all
>>>> attempts to change the type of the variable fail. Also, that would need to
>>>> divorce the frozen type from the dynamic version so the dynamic version can
>>>> still be mutated. That concept should work, but it might prove to be
>>>> ridiculously complicated since it risks a proliferation of objects all of
>>>> type Foo but with different type definitions. One way to get around that is
>>>> to flag a type as static the first time it is used in a statically typed
>>>> variable definition. This would cause an error to be thrown should any part
>>>> of the class be altered. Not sure how workable that is.
>>>>
>>>> > but that begs the question of what is the type of just ['a', 'b'].
>>>>
>>>> It should be any[]. Typing should be as non-aggressive as possible.
>>>> Auto typing should only consider the top level data to determine the type,
>>>> and in this case, that's an Array. To make c restricted to string elements,
>>>> the type would need to be specified as string[].
>>>>
>>>> > If you follow this to its logical conclusion and think about what the
>>>> types of various methods that work on arrays should be, you end up with an
>>>> enormous and confusing variety of array and object types, which is
>>>> something we explored years ago.
>>>>
>>>> Maybe, but that's always the case with any type system that allows for
>>>> user-defined types. The main problem here is the memory requirements for
>>>> storing all of those types. If I remember the description of V8 internals,
>>>> it seems to have already managed this issue. At least in V8, the challenge
>>>> would be in permanently associating a specific evolution of an internal
>>>> type to a variable.
>>>>
>>>> On Wed, Apr 3, 2019 at 7:50 PM Waldemar Horwat <walde...@google.com>
>>>> wrote:
>>>>
>>>>> On 3/23/19 1:34 PM, IdkGoodName Vilius wrote:
>>>>> > This is a proposal for static typing. Here is the github repository
>>>>> link: https://github.com/CreatorVilius/Proposal-Static-Typing
>>>>> > I think it would be great thing in JS.
>>>>>
>>>>> We intentionally reserved syntax so that something like that would be
>>>>> possible in the future.
>>>>>
>>>>> I've also spent a lot of time working on past proposals to do such
>>>>> things.  A few interesting issues would invariably arise that make both
>>>>> static and runtime typing unsound:
>>>>>
>>>>> - If you allow user-defined types, objects can spontaneously change
>>>>> their type by mutating their prototype.  Thus, you can declare a variable 
>>>>> x
>>>>> to have type Foo and check that you're assigning an instance of Foo to it,
>>>>> but the value x can become a Bar (different from a Foo) spontaneously
>>>>> without any operations on x.
>>>>>
>>>>> - Something similar happens with trying to type arrays.  You wrote:
>>>>>
>>>>> let c: auto = ['a', 'b']  // c is now string[]
>>>>>
>>>>> but that begs the question of what is the type of just ['a', 'b'].
>>>>>
>>>>> - Is it string[]?  No, it can't be that because you can replace its
>>>>> second element with a number.
>>>>> - Is it any[]?  Well, in that case c should have type any[], not
>>>>> string[]
>>>>> - Is it object?  In that case c should have type Object.
>>>>> and so on.
>>>>>
>>>>> If you follow this to its logical conclusion and think about what the
>>>>> types of various methods that work on arrays should be, you end up with an
>>>>> enormous and confusing variety of array and object types, which is
>>>>> something we explored years ago.  In some cases you'd want structural
>>>>> types, in some cases you'd want 'like' types (an array of anything which
>>>>> just happens to hold numbers at the moment), and so on.
>>>>>
>>>>>      Waldemar
>>>>> _______________________________________________
>>>>> es-discuss mailing list
>>>>> es-discuss@mozilla.org
>>>>> https://mail.mozilla.org/listinfo/es-discuss
>>>>>
>>>> _______________________________________________
>>>> es-discuss mailing list
>>>> es-discuss@mozilla.org
>>>> https://mail.mozilla.org/listinfo/es-discuss
>>>>
>>>
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to