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: