title: Make all fields in an interface readonly in a nested way
body: <p>I know that, we can use <em>Readonly&lt; T></em> to redeclare all fields of <em>T</em> as readonly, as in: [<a href="https://stackoverflow.com/questions/41201198/typescript-extending-an-interface-and-redeclaring-the-existing-fields-as-readon][1]">Typescript: extending an interface and redeclaring the existing fields as readonly</a></p>
  
  <p>What about nested fields? For example:</p>
  
  <pre><code>interface School {
    teachers: Array&lt;Teacher&gt;;
    students: Array&lt;Student&gt;;
  }
  
  interface Teacher {
    teacherId: number;
    personInfo: PersonInfo;
  }
  
  interface Student {
    studentId: number;
    personInfo: PersonInfo;
  }
  
  interface PersonInfo {
    name: string;
    age: number
  }
  </code></pre>
  
  <p>How to create a SchoolReadonly type, in which all nested fields are readonly.</p>
  
  <p>A simple test case:</p>
  
  <pre><code>var s: SchoolReadonly = {
    teachers: [{teacherId: 1, personInfo: {name: "John", age: 40}}],
    students: [{studentId: 1, personInfo: {name: "Dan", age: 20}}]
  }
  
  s.teachers[0].personInfo.name = "John2"; //should produce readonly error
  s.students[0].personInfo.age = 22; //should produce readonly error
  </code></pre>
  
  <p>As a constraint, I do not want to add <em>Readonly</em> directly to the School, Teacher, Student and PersonInfo interfaces.</p>