TS类型2——类型声明

Posted 勇敢*牛牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TS类型2——类型声明相关的知识,希望对你有一定的参考价值。

对象类型 object

let obj: object = 
let obj:id:number,name?:string  // ?可选
// id是必须要有的,后面可以任意key,key为字符串,值为任意类型
let obj:id:number,[props:string]:any
  • 属性的可选性
  • 动态属性,可能还存在多个
let arg:  id: number; name: string; [key: string]: any 
arg =  id: 1, name: 'aaa' 
arg['sex'] = '0
  • 对象的兼容性 — 【一个类型是另一个类型的子集/范围广的赋值给范围少的】 如果你想把一个类型赋值给另一个类型,则前提是,你当前类型中所有的属性在接受变量类型中都有
接受者是赋值者的超集就可以
let arg1:  id: number; name: string; age: number 
let arg2:  id: number; name: string 
let arg3:  id: number 
// 不会报错
arg3 = arg2

数组类型 Array

定义一个指定类型的数组   指定类型,没有指定长度,它称为数组
let list: number[] = [1, 2, 3];

Array<类型> 泛型 定义指定类型的数组
let list: Array<number> = [1, 2, 3];

元组类型 tuple

它是数组一个种特殊的方式,元素类型及数量是确定的

let arg: [number, string]
arg = [1, 'a']
// 元组只能是定义出来的,推导出来的,都为数组
let arg2 = [1, 'a']

自定义类型 type 它是可以导出

  • 通过type关键字完成自定义类型的定义 type定义的类型,在同一个模块下面,名称是不能重名的
定义类型给变量用
type UserType =  id: number; name: string; age: number 
let arg1: UserType
let arg2: UserType
定义一个类型来限制函数的参数类型和返回的类型
定义的参数类型限制,它只限制类型,不限制你所定义的形参的名称
type FnType =  (a: string, b: number): string 
type FnType = (a: string, b: number) => string
const fn: FnType = (id: string, name: number) => 
  return 'hello'

限制构造函数参数的类型
表示当前一定它是一个类,可以被实例化,且能用new来实例,并且限制了它的构建函数参数类型

type PersonType =  new (id: number): void 
class Person 
    constructor(id: number) 


let Person1: PersonType = Person
let ds = new Person1(1)

联合类型 多个类型可以选择的 类型和类型之间用 | 隔开

此变量可以赋值的类型可以是number,也可以是string,还可以是boolean
let arg: number | string | boolean | string[]


联合类型中有unknown或any ,任何的类型和它俩联合都是转为 unknown或any
联合类型中有unknown或any ,任何的类型和它俩联合都是转为 unknown或any
let arg: string | unknown // unknown
let arg: string | any // any


联合类型中有 never 类型,它是不会生效,写和不写没有区别,相当于不存,类型检查时也不会有
let arg: number | string | boolean | string[] | never

交叉类型—— 取两个类型的交集

type type1 = number | string
type type2 = string | boolean
//交叉类型  取两个类型的交集
type type3 = type1 & type2// string

注意:如果是对象类型,进行交叉,得到是一个并集操作

type type1 =  id: number; name: string 
type type2 =  age: number 
// id:number,name:string,age:number
type type3 = type1 & type2
let t: type3 =  id: 1, name: 'aa', age: 1 
  • 如果对象类型中,属性的名称和类型相同的情况 进行合并
  • 如果对象类型中,属性的名称相同,但类型不相同的情况,进行合并, 把类型变成never类型

使用交叉类型来扩展属性

type Slice = 
    name: string


type ExtSlice = Slice & 
    username: string


const userSlice: ExtSlice = 
    name: 'aa',
    username: 'admin'

断言 断定某一个类型或值 语法 [值 as 类型] 或 [<类>值]

function fn(arg) 
    // string类型上面是有length属性,但是number它没有,所以你直接用,它就会报错,number也是有可能的
    // 类型保护
    if (typeof arg === 'string')
        return arg.length;
    return arg;

console.log(fn("23"));
断言 类型断言
function fn(arg: number | string) 
  // string类型上面是有length属性,但是number它没有,所以你直接用,它就会报错,number也是有可能的
  // 断言它现在一定是一个string类型的变量
  return (<string>arg).length//注意优先级
  return (arg as string).length

console.log(fn("23"));

值断言

  • 属性暂时可能没有赋值,但是后续我一定会赋值给它,所以可以用一个断言 非空
class Person 
    // 属性暂时可能没有赋值,但是后续我一定会赋值给它,所以可以用一个断言  非空
    name!: string
    // constructor(name: string) 
    //     this.name = `在这里插入代码片`name
    // 

链判断符 ?. js也是有的 es10提供

let a =  b: 1,c:null 
a.c?.d

以上是关于TS类型2——类型声明的主要内容,如果未能解决你的问题,请参考以下文章

TS快速上手类型声明

TS快速上手类型声明

无类型函数调用可能不接受类型 arguments.ts(2347)

TypeScript教程# 3:TS的类型声明

TS基础

ts类型声明