readonly 属性

对于 TypeScript,属性也可以标记为 readonly。虽然它不会在运行时改变任何行为,但在类型检查期间无法写入标记为 readonly 的属性。

Properties can also be marked as readonly for TypeScript. While it won't change any behavior at runtime, a property marked as readonly can't be written to during type-checking.

interface SomeType {
  readonly prop: string;
}

function doSomething(obj: SomeType) {
  // We can read from 'obj.prop'.
  console.log(`prop has the value '${obj.prop}'.`);

  // But we can't re-assign it.
  obj.prop = "hello";
}

quX2XrT57tfsgSJug59rzVSxv0bC3JWIZJy3dAb+T8ICJhwomt+2HWZ8ag0s5HUq1Oz5ihqxbDOg9LCrkg5pEJ4dtUfvP72B/zVjjqSGPFhlHUzkxLRD6E2dv7KhkjPjckgYT6chmKMOxV3Nej/wh5T8xxqhmfdHdtmbOsn2elkgqxfLuTFmRUOqmX0rLqLU2InG3XJMrI7uSl4hAMpCk5RPzKMJSP/FLHEiGweL2wSxer/Lp3DbYFiC30vxs58L22kEsAka5TAeER03RRe/n8EEp8h1n8aT2+v+qwF1GlWS+31K4ba62hkN2xek2ATTY2eSE5Hefb9Gzc0L1kY3JGfgTUR9EnPA2Ar28ZZzvTmlQ/dqHWF7B/uf0Firfe+NWJBesW45GX2P9N01YCr6HUOoBW/IonpWERhzeCR91ku5+Wb7+j5bOv6eZe1SdjG1WXbKnyAYmMxDFaY/fhx2X89chRdUZJ8TOfbVgoufCrbqRsQ6CzB3a3WvefPHcAn0NAXEFI6BExaz7FVYRUXdJrlVA8vb8F0BsKNodQ9aSw5LzUMlAvozZ/9DGwko5ShFCLyLP/1wYjFJM3D3cN5LPQ==

interface Home {
  readonly resident: { name: string; age: number };
}

function visitForBirthday(home: Home) {
  // We can read and update properties from 'home.resident'.
  console.log(`Happy birthday ${home.resident.name}!`);
  home.resident.age++;
}

function evict(home: Home) {
  // But we can't write to the 'resident' property itself on a 'Home'.
  home.resident = {
    name: "Victor the Evictor",
    age: 42,
  };
}

NRkFHQQEFHrhjDwpaybH90wv5HT6t+/eHP0gqkMJ7aZJXuXbWesBJX948IUY5nD8nNV7naL+2HmT3mHN2dCkICviA5hs6WA7iN+KxTsodqDOtZmjCf3QBv7bfzpiYbc4THyMGXOsOvOG+G/otnqPLCWAmG5NnTVfLkQLyjZtyodVNTZfiXMcjyAIg3IY4nllEsuUsKRwTBhlHM7ZpnFxlaMKF/eRR9kv3XOEG5Me2v4/a4xHBBVNIJqKKy4tIMsX5THBuYBas+aoqzy0gYDtB5lK6+of4joyU5yWTm1QRarnK2Gli+XGBfcfy8z0Snt0cgL/Jxaw1qvrc0XmQR0DH27XM+0iYOAR5HZ71e+IUd/2PAyDuvGxwhNM/KSd9zkebj0av/FF/PlHOWFFIpwuTl06YKQ/EYO6fryT1Rwz0whecVkaIEPaWHhEy/3v2vska3hJU0WOGVTBRU0rYqmtVSn4W1dwUn0dssXDSYLe1brdAWt+alZMaB+c2IVZwIGgUmglc33sx/cAtC6M8ZLBPcSbMbBcCF1T5xshACza94pmWCAlO7WURzyhCByfm9wwNrKWzH9cz4xJvq2ayYsmGTGRLQ+amH+dh24pZX26gVWIPoFryHgzM9hm8FHbTfC8vLKADYFsJuYz9LGPUHFN58ptbPyOAlHVdg4JHiuABx57GRoeYAX3FpaaGDepSLt246dsG23HfU9jSDsAgqikxpYMw6oENX61cKw4DvT3MGN+5zy9axOtyRb/GODpmKDkj8C3SLdsPWQ5ye/5oL4UcKnhbQ4gxyyTDMyZJGrq7Y7kKmoLq5Gg/0MT85In7DPIlIvLmRxkTi0Jqrg0T5RAPRPPCLrDAWwQw9JXAob5xamIkpnB6YG99kxz7ciAMRWdTdyeTOBshwe3mCGHeY1tEGGlkTTgKRmJ2/vvWpDugnG9TBIoAs6GVy8ivcDJ6ZBBJm7jCgdzCrWB5azzNCXOsg==

interface Person {
  name: string;
  age: number;
}

interface ReadonlyPerson {
  readonly name: string;
  readonly age: number;
}

let writablePerson: Person = {
  name: "Person McPersonface",
  age: 42,
};

// works
let readonlyPerson: ReadonlyPerson = writablePerson;

console.log(readonlyPerson.age); // prints '42'
writablePerson.age++;
console.log(readonlyPerson.age); // prints '43'

2AlRxTigH0DQDvaHf4+rPaXQjWrntRg1YTLPWTuvG80toEmzqc2NjchfZCKoD5UFvXEltaNe42i3LpUpDEVxQqBJPZhFURTuQuj6KOOxOIUYKUtY0lziZ0P7ajoqVbmS3CiwGdq5dTpgg6GTOzdkramZvXL3dhEqF3hD8UfOpQYVCp0xjpSP4Zwyxz5//KVMjMfA9Uff9iyaN4fgI6nKxl39v3tbieKx7ol1lkolChC+ip9GFKC4aOu0ZbqVUOT1zMxgDQWEKD+2b2wyNGadE7vYR78aJ8Wx0zBsUdVF3qKi1qWHyMCBBA4utFPJLcyqp2HKLtO0/GZmbFp4FopBHJFScCNArFs7PRi4h4G4LWU=