>>140
TypeScriptではそのブランディング手法をインタフェースだけでなくブランド型として実現する方法も行われてるよ

type UserId = number & { __brand: "UserId" };
type ProductId = number & { __brand: "ProductId" };

この方法でも型名と構造のための隠しフィールドで二重に名前を持たせる点は同じ
それ以外も同じで結果的に構造を比較するときに名前を比較することになって名前的型付けになる仕組み
構造的型付けの敗北だね