Search code examples
javascriptc#typescriptoopoverriding

Equivalent of c# class virtual member in TypeScript


So in C# when I've been creating model classes and lazy loading things, I do something like this:

public int? User_ID { get; set; }
public int? Dept_ID { get; set; }

Then a little farther down in my class I pop in my virtuals like so:

public virtual User User {get; set;}
public virtual Department Dept {get; set;}

How would I do this in Typescript? Something like this?:

User_ID: number;
Dept_ID: number;
User: User;
Dept: Department;

I don't think interfaces is what I want/need...but then again protected doesn't seem correct either. Something tells me I'm missing an obvious answer here.


Solution

  • The following applies equally to TypeScript and JavaScript:

    There is no equivalent.

    Every member access in JavaScript is subject to dynamic dispatch by definition. This is because member access in JavaScript is, morally, a key lookup in a hash table.

    An object may declare a member with the same key as one it inherits via the prototype chain and thereby shadow the inherited member but this is not the same as virtualness, a concept not present in the language.


    Note that C# has a similar concept, known as hiding, which can be used to statically shadow an inherited member without overriding it. However this largely disanalogous, existing to address the needs of C#'s runtime impacting and fully reified type system.