TypeScript编译器在做类型检查时,所秉承的一些原则,以及表现出的一些行为。
作用:辅助开发,提高开发效率

一、类型推断

有时候不需要我们直接指定变量的类型(函数返回值类型),TypeScript可以根据某些规则自动的为其推断出一个类型。

  • 基础类型推断 ```typescript // 1、初始化一些变量的时候 let a // ts推断变量a是any类型 let b = 1 // ts推断变量b是nubmer类型 // 2、设置函数默认参数的时候,会根据参数类型,自动推断出返回值类型 let c = (x = 1) => x + 1

// 以上都是从右向做推断,也就是通过右边的类型,推断出左侧变量的类型

  1. - 最佳通用类型推断
  2. - 上下文类型推断
  3. ```typescript
  4. // 根据左侧的事件绑定,推断出右侧事件的类型
  5. window.onkeydown = (event: any) => {
  6. console.log(event)
  7. }
  8. // 可以推断出event中的事件
  • 类型断言(自己可以断言自己代码的类型) ```typescript // 类型断言 // let foo = {} // foo.bar = 1 // 这个代码会报错,foo对象上没有bar属性

// 解决 // 该方案的问题:如果不给foo增加bar属性,也是可以的,这样代码就不严谨了 // interface Foo { // bar: number // } // let foo = {} as Foo // foo.bar = 1

// 优化 interface Foo { bar: number } let foo: Foo = { bar: 1 }

// 类型断言不能随意使用,如果对代码的上下文关系不是非常确定,就不要轻易使用类型断言

```typescript

let name: string|number;
console.log((name! as string).length)
console.log((name! as number).toFixed(2))
// 双重断言
// 不能直接把string|number类型断言成布尔类型,需要双重断言才可以
console.log((name! as any as boolean))

二、类型兼容性

当一个类型Y可以被赋值给另一个类型X时,我们就可以说类型X兼容类型Y。
X兼容Y:X(目标类型)= Y(源类型)
接口之间的兼容性:成员少的兼容成员多的
函数之间的兼容性:参数的个数(参数多的兼容参数少的);参数类型必须要匹配;返回值类型。
口诀:
结构之间兼容:成员少的兼容成员多的;
函数质检兼容:参数多的兼容参数少的;

三、类型保护

TypeScript能够在特定的区块中保证变量属于某种确定的类型。
可以在此区块中放心的引用此类型的属性,或者调用此类型的方法。

enum Type {Strong, week}
class Java {
    helloJava() {
        console.log('hello java')
    }
}
class JavaScript {
    helloJavaScript() {
        console.log('hello javaScript')
    }
}
function getLanguage(type: Type) {
    let lang = type === Type.Strong ? new Java() : new JavaScript()
    // 需要添加类型断言
    if ((lang as Java).helloJava) {
        (lang as Java).helloJava()
    } else {
        (lang as JavaScript).helloJavaScript()
    }
    // 这样写法不好
    return lang
}
getLanguage(Type.Strong)
// 想添加一个功能,创建实例之后,运行实例的打印方法
  • instanceof(判断一个实例是否属于某个类)

    enum Type {Strong, week}
    class Java {
      helloJava() {
          console.log('hello java')
      }
    }
    class JavaScript {
      helloJavaScript() {
          console.log('hello javaScript')
      }
    }
    function getLanguage(type: Type) {
      let lang = type === Type.Strong ? new Java() : new JavaScript()
      if (lang instanceof Java) {
          lang.helloJava()
      } else {
          lang.helloJavaScript()
      }
      // 这样写法不好
      return lang
    }
    getLanguage(Type.Strong)
    
  • in(判断一个属性是否属于某个对象)

    enum Type {Strong, week}
    class Java {
      helloJava() {
          console.log('hello java')
      }
      java: any
    }
    class JavaScript {
      helloJavaScript() {
          console.log('hello javaScript')
      }
      javaScript: any
    }
    function getLanguage(type: Type) {
      let lang = type === Type.Strong ? new Java() : new JavaScript()
      if ('java' in lang) {
          lang.helloJava()
      } else {
          lang.helloJavaScript()
      }
      // 这样写法不好
      return lang
    }
    getLanguage(Type.Strong)
    
  • typeof(帮助我们判断一个基本类型)

    enum Type {Strong, week}
    class Java {
      helloJava() {
          console.log('hello java')
      }
    }
    class JavaScript {
      helloJavaScript() {
          console.log('hello javaScript')
      }
    }
    function getLanguage(type: Type, x: string | number) {
      let lang = type === Type.Strong ? new Java() : new JavaScript()
      if (typeof x === 'string') {
          // x拥有字符串的方法和属性
          x.length
      } else {
          // x拥有数字的方法和属性
          x.toFixed(1)
      }
      // 这样写法不好
      return lang
    }
    getLanguage(Type.Strong)
    
  • 创建类型保护函数

    enum Type {Strong, week}
    class Java {
      helloJava() {
          console.log('hello java')
      }
    }
    class JavaScript {
      helloJavaScript() {
          console.log('hello javaScript')
      }
    }
    function jsJava(lang: Java | JavaScript): lang is Java {
      return (lang as Java).helloJava !== undefined
    }
    function getLanguage(type: Type, x: string | number) {
      let lang = type === Type.Strong ? new Java() : new JavaScript()
      if (isJava(lang)) {
          lang.helloJava()
      } else {
          lang.helloJavaScript()
      }
      return lang
    }
    getLanguage(Type.Strong)