TypeScript/TS入门学习8

52 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情

TS中的兼容性

自动类型推论

  1. 根据初始值进行类型推论
  • 不用明确编辑器具体是什么类型,编译器就知道是什么类型,根据初始化值自动推断 注意:如果是先定义再初始化,那么就推论结果是any
let name = '实则棒'
name = '大坏蛋'
name = 12

name类型已经被推论成string类型,可以给name赋值string,但是不能复制number和其他类型的值了。 image.png 下面这个类型推论为number[]类型,

let arr = [1, 2, null];
arr = [2, 3, 4, null, 23, null, true]

image.png 如果没有最后一个true,就是合理的。

先定义,再初始化,那推论出来的结果就是any了,无论赋值什么类型的值都是合法的,就和没用ts一样

let age;
age = 19;
age = 'number'

  1. 上下文推论 typeScript 类型推论也可能按照相反方向进行,这被叫做‘按上下文归类’,按上下文归类会发生在表达式的类型与所处的位置相对时

上下文推论,可以推论出x和y都是number类型,所以该表达式不会报错

interface AddFunction {
    (x: number, y: number): number;
}
let f: AddFunction = (x, y) => {
    return x + y;
}

对象类型推论

  • 可多不可少
  • 会进行递归检查 下面这个代码除了最后一句会报错,其他都是合法的, p=n1不报错,证明了对象也有类型推论 p=n2不报错,证明了可以比需要的属性多,多了一个age p=n3报错,证明了不可以比需要的属性少,提示缺少name属性,不能将{age:number}类型赋值给{name:string}类型
interface Person {
    name: string;
}
let n1 = {
    name: '石头'
}
let n2 = {
    name: '石头',
    age: 19
}

let n3 = {
    age: 19
}

let p: Person;
p = n1;
p = n2;
p = n3;

递归检查 最后一句是会报错的,虽然是第二层级里的age类型不匹配,但是也能检测出来

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


let p1 = { name: '石头', children: { age: 122 } };
let p2 = { name: "实则棒", children: { age: true } };

let p: Person;
p = p1;
p = p2;