[C#]MemoryPackを使ってみたい6 - GenerateTypeScriptのオプション追加(2点)

Cysharp/MemoryPack

ver1.5.0以降、ver1.8.10までで、TypeScript出力時のオプションが2つ追加されています。

Configure import file extension and member name casing

MemoryPackGenerator_TypeScriptImportExtension

<ItemGroup>
    <CompilerVisibleProperty Include="MemoryPackGenerator_TypeScriptImportExtension" />
</ItemGroup>
<PropertyGroup>
    <!-- allows empty -->
    <MemoryPackGenerator_TypeScriptImportExtension></MemoryPackGenerator_TypeScriptImportExtension>
</PropertyGroup>

TypeScriptのコードが出力される際、importで指定されるファイル名の拡張子をカスタマイズできます。

MemoryPackGenerator_TypeScriptImportExtensionをcsprojに追加しなければデフォルトで.jsが付加されます。

import { MemoryPackWriter } from "./MemoryPackWriter.js";
import { MemoryPackReader } from "./MemoryPackReader.js";

MemoryPackGenerator_TypeScriptImportExtensionを空にしておくと、

import { MemoryPackWriter } from "./MemoryPackWriter";
import { MemoryPackReader } from "./MemoryPackReader";

こう。 MemoryPackGenerator_TypeScriptImportExtension.tsにしておくと

import { MemoryPackWriter } from "./MemoryPackWriter.ts";
import { MemoryPackReader } from "./MemoryPackReader.ts";

といった感じになります。

JavaScriptは処理系によってこの辺の記述が変わるので、用途に応じてカスタマイズできるようになりました。

MemoryPackGenerator_TypeScriptConvertPropertyName

<ItemGroup>
    <CompilerVisibleProperty Include="MemoryPackGenerator_TypeScriptConvertPropertyName" />
</ItemGroup>
<PropertyGroup>
    <!-- default is true -->
    <MemoryPackGenerator_TypeScriptConvertPropertyName></MemoryPackGenerator_TypeScriptConvertPropertyName>
</PropertyGroup>

TypeScriptコードが生成されるときに、デフォルトではフィールド名がcamelCaseになりますが、これをfalseにしておくことでC#側で指定したフィールド名のままで生成されるようになります。

[MemoryPackable]
[GenerateTypeScript]
public partial class User
{
    public int UserId { get; set; }
    public string UserName { get; set; } = default!;
}

falseの時。

export class User {
    UserId: number;
    UserName: string | null;

    constructor() {
        this.UserId = 0;
        this.UserName = null;

    }

    ...

デフォルトまたはtrueの時。

export class User {
    userId: number;
    userName: string | null;

    constructor() {
        this.userId = 0;
        this.userName = null;

    }

    ...

名前付けルールにもあわせることができます。

まとめ

初回のリリースから2ヶ月ほどたちますが、皆さん結構注目しているようで採用事例も出てきていますし、バージョンも1.8.10まできていて着々と強化されていますね。