1. const getPersonName = (p: {name: string}) => {
    2. console.log(p.name)
    3. }
    4. const setPersonName = (p: {name: string}, name: string) => {
    5. p.name = name;
    6. }
    7. // 发现 p 的结构重复了
    8. interface P {
    9. name: string
    10. }
    11. type P_1 = {
    12. name: string
    13. }
    14. const getPersonName = (p: P) => {
    15. console.log(p.name)
    16. }
    17. const setPersonName = (p: P, name: string) => {
    18. p.name = name;
    19. }
    20. // interface 和 type 区别
    21. // 区别不大,主要是
    22. type P_2 = string; // 而interface不可以直接等于基础类型
    23. // TS 中建议,可以使用 interface 的地方就使用interface,实在不可以的时候再选择 type
    24. // 如果需要 P 再有一个可有可无的 age
    25. interface P {
    26. name: string,
    27. age?: number
    28. }
    29. // readonly
    30. interface P {
    31. readonly name: string,
    32. age?: number
    33. }
    interface P {
      readonly name: string
    }
    
    const getPersonName = (p: P) => {
      console.log(p.name)
    }
    
    const p = {
      name: 'zwx',
      age: 26
    }
    
    getPersonName(p) //ok
    
    getPersonName({
      name: 'zwx',
      age: 26 // 报错
    })
    
    /*
      当字面量传递的时候 是强校验
      反之,不是强校验
    */
    
    interface P {
      readonly name: string;
      age: number;
      [propName: string]: any; // 除了name、age,其他的属性只要是满足 key:string = value:any
      say(): string; // 还要求必须有一个say方法,返回值是string
    }
    
    interface P {
      readonly name: string;
      [propName: string]: any;
      say(): string
    }
    
    class User implements P {
      name: 'zwx'
      say() {
        return 'hi'
      }
    }
    
    interface P {
      readonly name: string;
      [propName: string]: any;
      say(): string
    }
    
    interface T extends P {
      teach(word: string): string // 要求参数word,并且是 string 类型
    }
    
    • typeinterface 相类似,但并不完全一致
    • 接口只在编辑代码时的语法校验工具,并不会编译到 js 中

    截屏2022-06-13 19.43.22.png