Skip to content

Structs and Tuples

Structs

.NET structs are projected to TypeScript as classes, however the JS marshaller handles them very differently from .NET classes. .NET structs are marshalled by value. This has a few implications:

  • Every time a .NET struct instance is marshalled to JS, a new instance of the corresponding JS class is constructed, with copied/marshalled property values.
  • Every time a JS class instance is marshalled to a .NET struct, a new instance of the struct is constructed, with copied/marshalled property values.
  • There is no object lifetime relationship between a .NET struct instance and a JS class instance created from it.
  • Getting or setting an instance property on a JS class instance created from a .NET structdoes not invoke the .NET getter / setter code (if any).
  • Invoking an instance method on a JS class instance created from a .NET struct does invoke the .NET instance method, though the struct gets entirely copied/marshalled from JS to .NET before every .NET method invocation.

Read-only properties

Read-only properties of .NET struct types are supported by the marshaller if they are initializable, that is if they are defined as { get; init; } and not just { get; }. When marshalling a JS object to a .NET struct, the .NET properties are all initialized by marshalling the property values from the JS object.

Static members

Static properties and methods on a .NET struct work the same as on a class, since static members do not deal with an instance that gets marshalled by value. (The struct type object is still marshalled by reference.)

Tuples

C# TypeJS Type
Tuple
ValueTuple
[]
Tuple<A>
ValueTuple<A>
[A]
Tuple<A, B, …>
ValueTuple<A, B, …>
[A, B, …]

.NET tuples, including all variations of Tuple<> and ValueTuple<>, are marshalled as JS arrays, and the tuple types are projected as TypeScript array tuples. (Tuple field names, if any, are not used in JS.)

C#
[JSExport]
public static (string Name, double Value) GetNameAndValue();
TS
export function getNameAndValue(): [string, number];

Released under the MIT license