TypeScript 笔记——类型和接口

TypeScript 笔记——类型和接口typescript 笔记 类型和接口 typescreap 接口类型数据初始化

大家好,欢迎来到IT知识分享网。

ts主要是为js添加类型系统,使问题在开发阶段暴露出来,有利于提早发现错误,避免使用时报错。另一方面,函数定义里面加入类型,具有提示作用,可以告诉开发者这个函数怎么用。
动态类型:当一个变量定义为number类型时后面还可从新赋值为string类型的,也就是说变量的类型是动态的
静态类型:引入ts后,变量的类型就可以被确定,在赋值错误的时候会有相关提示,可以更早的发现问题,解决问题。


一、类型

1、基本类型: number、string、null、undefined、boolean、undefined、object、symbol、bigint(target不低于es2020)

没有声明类型的变量被赋值为undefined或null时,类型会被推断为any(如果希望避免这种情况,则需要打开编译选项strictNullChecks),此时被赋值为undefined的变量的类型被推断为undefined,被赋值为null的变量的类型被推断为undefined

Object、object、{}的区别:
(1)、{}是Object类型的简写形式,所以使用Object时常常用空对象代替。
(2)、object筛选引用类型(即只有对象、数组、函数能定义为object类型)
(3)、Object除了undefined和null这两个值不能赋值给Object类型,其他任何值都可以赋值给Object类型。

//string类型 let str: String = 'wml' //number类型 // number支持无穷大、各种进制、NaN let num: number = NaN let num1: number = Infinity //boolean类型 let b: boolean = false //object类型 let obj:object obj:object = { 
    a: '你好’}; obj = [1, 2]; obj = (a:number) => a + 2; //null类型 let n: null = null //undefined类型 let c: undefined = undefined let v1: void = null //严格模式下void不能赋值为null let v2: void = undefined c = n //严格模式不能穿插赋值 n = c //严格模式不能穿插赋值 function myFn(): void { 
    // return 123 } console.log(b, str, "str", num, num1, v2, n, c, myFn()); 

2、any、unknown、never类型

any、unknown(ts称为顶层类型)区别:
1、any可以赋值给所有类型,unknown只能赋值给自己或者是any类型
2、unknown没法读任何属性 方法也不可以调用,而any类型可以
3、unknown比any更加安全
never类型(ts称为底层类型):该类型为空,不包含任何值。

function add(x:boolean|number) { 
    if (typeof x === 'boolean') { 
    // ... } else if (typeof x === 'number') { 
    // ... } else { 
    x; // never 类型 } } 

3、联合类型

type:用来定义一个类型的别名。

// type A = void | number | never //联合类型时never会被忽略(即type A=void | number) type A = '常' | '挑' | '篮球' function Kun(value: A) { 
    switch (value) { 
    case "常": break case "挑": break case "篮球": break default: // 兜底逻辑 const error: never = value break } } 

4、交叉类型

interface People { 
    name: string, age: number } interface Man { 
    sex: number } const wu = (man: Man & People): void => { 
    console.log(man); } wu({ 
    name: '11', age: 123, sex: 1 }) 

5、值类型

let x: 'a' x='a' //正确 x='b' //报错 console.log(x) 

6、包装对象类型与字面量类型

Boolean、String、Number、Symbol、BigInt五种包装对象之中,symbol 类型和 bigint 类型无法直接获取它们的包装对象(即Symbol()和BigInt()不能作为构造函数使用),但是剩下三种可以。

  • Boolean()
  • String()
  • Number()
'hello' // 字面量定义 new String('hello') // 包装对象定义 //包装对象即 String 同时包含字面量类型和包装对象类型 const s1:String = 'hello'; // 正确 const s2:String = new String('hello'); // 正确 //字面量类型即 string 只包含字面量类型 const s3:string = 'hello'; // 正确 const s4:string = new String('hello'); // 报错 

使用类型时建议只使用小写类型,不使用大写类型。因为绝大部分使用原始类型的场合,都是使用字面量,不使用包装对象。而且,TypeScript 把很多内置方法的参数,定义成小写类型,使用大写类型会报错。

7、枚举类型(enum)

let obj = { 
    red: 0, green: 1, blue: 2 } console.log(obj); enum Color { 
    red = 1, //增长类型枚举 green, blue } console.log(Color.red, Color.green, Color.blue); 字符串枚举 enum Color { 
    red = 'red', //增长类型枚举 green = 'green', blue = 'blue' //都要初始化 } console.log(Color.red, Color.green, Color.blue); enum Color { 
    aa, yes = 2, //这里如果是数字的话定义bb不会报错,如果初始化时字符串就会报错 bb, no = 'no' } console.log(Color.aa, Color.yes, Color.bb, Color.no); interface A { 
    red: Color.yes } let obj: A = { 
    red: Color.yes } //const枚举(使用const会编译成为常量,而不是的话则会编译成对象) enum Types { 
    success, fail } let code: number = 0 if (code == Types.success) { 
    } 

TypeScript 支持块级类型声明,即类型可以声明在代码块(用大括号表示)里面,并且只在当前代码块有效。

在这里插入代码片 
if (true) { 
    type T = number; let v:T = 5; } else { 
    type T = string; let v:T = 'hello'; } 

二、接口

接口

1、interface遇到同名会合并类型
2、如果属性是可选的,就在属性名后面加一个?
3、如果属性是只读的,就加readonly(常用于函数,id)
4、对象的属性索引
一个接口中,最多只能定义一个字符串索引。字符串索引会约束该类型中所有名字为字符串的属性。
属性索引共有string、number和symbol三种类型。

下面例子中,我定义了[propName: string]为any类型,所以name,age,id,cb才不会报错,如果设置其他类型就会报错
5、接口继承
6、interface定义函数类型
7、字符串索引与数值索引
数值索引必须兼容字符串索引的类型声明。

interface B { 
    xx: string } interface As extends B { 
    readonly id?: number name: string age?: number [propName: string]: any //key为任意字符串类型,对象的属性索引 readonly cb: () => boolean } //此处a的类型为接口B,所以必须符合B指定的结构, let a: As = { 
    name: '琳', // age: 88, d: 1, c: false, cb: () => { 
    return false }, xx: '66' } a.cb() console.log(a); interface Fn { 
    (name: string): number[] //接收参数类型 返回类型 } const fn: Fn = function (name: string) { 
    console.log(name); return [1] } console.log(fn('c')); //数值索引与字符串索引 interface A { 
    [prop: string]: number; [prop: number]: string; // 报错 } interface B { 
    [prop: string]: number; [prop: number]: number; // 正确 } //此处数值索引兼容字符串索引的类型声明。 

函数扩展

1、函数参数和返回值 function add(a: number, b: number): number{}
箭头函数定义类型和返回值 const add = (a: number, b: number): number => a + b
2、函数默认的参数 function add(a: number = 10, b: number = 20): number{}
函数可选参数 function add(a?: number, b?: number): number{} 函数默认值和可选参数不能混合使用
3、参数是一个对象如何定义 interface定义
4、函数this类型
ts可以定义this的类型,在js中无法使用,必须是第一个参数定义this的类型
5、函数重载
一个函数里实现增删改查

interface User { 
    name: string, age: number } function add(user: User): User { 
    return user } console.log(add({ 
    name: '小屋', age: 22 })); console.log(add(1, 1)); const add = (a: number, b: number): number => a + b interface Obj { 
    user: number[] add: (this: Obj, num: number) => void } // ts可以定义this的类型,在js中无法使用,必须是第一个参数定义this的类型 let obj: Obj = { 
    user: [2, 3, 1], add(this: Obj, num: number) { 
    this.user.push(num) } } obj.add(4) console.log(obj); let user: number[] = [1, 2, 3] function findNum(add: number[]): number[] //如果传的是个number类型的数组就是添加 function findNum(id: number): number[] //如果传入id就是单个查询 function findNum(): number[] //如果未传入id就是整个查询 function findNum(ids?: number | number[]): number[] { 
    if (typeof ids == 'number') { 
    return user.filter(v => v == ids) } else if (Array.isArray(ids)) { 
    user.push(...ids) return user } else { 
    return user } } console.log(findNum([4, 5, 6])); 

 type A = void | number | never //联合类型时会被忽略 

面试题:

interface 与 type 的异同
相同点:interface命令与type命令作用类似,都可以表示对象类型。
区别:
(1)type能够表示非对象类型,而interface只能表示对象类型(包括数组、函数等)。
(2)interface可以继承其他类型,type不支持继承。
(3)继承的主要作用是添加属性,type定义的对象类型如果想要添加属性,只能使用&运算符,重新定义一个类型。而interface为extends
(4) 同名interface会自动合并,同名type则会报错。也就是说,TypeScript 不允许使用type多次定义同一个类型。
(5)interface不能包含属性映射

interface Point { 
    x: number; y: number; } // 正确 type PointCopy1 = { 
    [Key in keyof Point]: Point[Key]; }; // 报错 interface PointCopy2 { 
    [Key in keyof Point]: Point[Key]; }; 

(6)this关键字只能用于interface。

// 正确 interface Foo { 
    add(num:number): this; }; // 报错 type Foo = { 
    add(num:number): this; }; class Calculator implements Foo { 
    result = 0; add(num:number) { 
    this.result += num; return this; } } 

(7)interface无法表达某些复杂类型(比如交叉类型和联合类型),但是type可以。

最后:如果有问题或不理解的地方请大家指出,谢谢大家~

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/156792.html

(0)
上一篇 2025-02-09 22:25
下一篇 2025-02-09 22:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信