TS学习笔记(2)

之前的笔记漏掉了一个对象

object、Object 和 {}

小 object 代表的是所有非原始类型,也就是说我们不能把 number、string、boolean、symbol等 原始类型赋值给 object。在严格模式下,nullundefined 类型也不能赋给 object。

// let lowerCaseObject: object;
// lowerCaseObject = 1; // ts报错
// lowerCaseObject = 'a'; // ts报错
// lowerCaseObject = true; // ts报错
// lowerCaseObject = null; // ts报错
// lowerCaseObject = {}; // ok

Object 也就是首字母大写的 代表所有拥有 toString、hasOwnProperty 方法的类型,所以所有原始类型、非原始类型都可以赋给 Object。同样,在严格模式下,null 和 undefined 类型也不能赋给 Object。

let upperCaseObject: Object;
upperCaseObject = 1; // ok
upperCaseObject = 'a'; // ok
upperCaseObject = true; // ok
upperCaseObject = null; // ts报错
upperCaseObject = undefined; // ts报错
upperCaseObject = {}; // ok

另外TS还有一个特点 我们平时用js一样的去写TS 你比如 直接写 let abc = 123 一样 这个abc我并没有给他定义一个类型

但是他并没有报错原因就是自动检测,自动赋予了

TypeScript 会根据上下文环境自动推断出变量的类型,无须我们再写明类型注解。因此,示例可以简化为如下所示内容

{
  let str: string = 'this is string';
  let num: number = 1;
  let bool: boolean = true;
}
{
  let str = 'this is string'; // 等价
  let num = 1; // 等价
  let bool = true; // 等价
}

我们把 TypeScript 这种基于赋值表达式推断类型的能力称之为类型推断

类型断言

有时候你会遇到这样的情况,你会比 TypeScript 更了解某个值的详细信息。通常这会发生在你清楚地知道一个实体具有比它现有类型更确切的类型

举例子

const arrayNumber: number[] = [1, 2, 3, 4];
const greaterThan2: number = arrayNumber.find(num => num > 2); //报错

为什么会报错 讲道理因为下面的greaterThan2不知道传过来的是数组还是一个undefined 因此find最后得出的到底是个啥typescript也不知道 我们是可以一眼看出来的 因此我们需要让Typescrpit知道 没错就是会传过来一个数字类型的 不要去纠结了s

这里就引用到了断言

const arrayNumber: number[] = [1, 2, 3, 4];
const greaterThan2: number = arrayNumber.find(num => num > 2) as number; //3

断言有两种写法

// 尖括号 语法
let someValue: any = "this is a string";
let strLength: number = (<string>someValue).length;

// as 语法
let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;

确定赋值断言

我们有时候会定义一个空的对象 不立刻赋值 在后面通过一个函数方法给他赋值 但是这样往往会报错

这个时候给他一个!告诉TS我会给这个值赋值

let x : number
function initialize() {
    x = 10;
  }
  initialize();
  console.log(2 * x); //报错

这样就不会报错了

let x! : number
function initialize() {
    x = 10;
  }
  initialize();
  console.log(2 * x); 

TypeScript 编译器就会知道该属性会被明确地赋值

posted @   jeffmmo  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示