diff --git a/articles/scripting-expressions-overview.md b/articles/scripting-expressions-overview.md index a9db17ee..b73edf5a 100644 --- a/articles/scripting-expressions-overview.md +++ b/articles/scripting-expressions-overview.md @@ -118,4 +118,13 @@ new( ) ``` -The example above projects the two unnamed items of a tuple into a new data object with an `X` and a `Y` property. \ No newline at end of file +The example above projects the two unnamed items of a tuple into a new data object with an `X` and a `Y` property. + +> [!Tip] +> Dynamic data classes are most useful when combined with operators which leverage the named structure of input types, e.g. [`CsvWriter`](xref:Bonsai.IO.CsvWriter) maps the type properties to header names. They are also useful to increase readability by naming the members of otherwise anonymous tuples, such as those generated by [`Zip`](xref:Bonsai.Reactive.Zip) and other combinators. + +> [!Note] +> Dynamic data classes are uniquely identified by their specification. If two data object initializers use matching property names with identical types declared in the same order, then the two expressions will be resolved to the same data object type. This allows type inference to work on reactive operators which require matching types in all the input sequences, e.g. [`Merge`](xref:Bonsai.Reactive.Merge). + +> [!Warning] +> Dynamic data classes do not have a predictable type signature and therefore cannot currently be serialized in the workflow file, nor be used in custom scripting extensions. \ No newline at end of file