Aliases also work well for object shapes. Optional properties are effectively T | undefined, and readonly communicates intent not to reassign.
type User = {
readonly id: number;
name: string;
};
const alice: User = { id: 1, name: "Alice" };
alice.name = "Alicia"; // ✅ OK, not readonly
alice.id = 2; // ❌ Error:type Person = { readonly id: number; name: string; nickname?: string }.display(p: Person): string returning:"<name> (<nickname>)" if nickname exists"<name>".