首先TS 主要解决的是 js类型不明确的主要问题 所以我们在定义变量的时候要写出他的类型
基本数据类型说起 上代码
let b : number // 这时候 b 的变量必须是 number 不然就报错
let isDone: boolean = false;
b = 1 // 当然你会说 是不是 还有其他的 类型 当然 js 有的类型他都有 他没有的 ts 也有
// 这样写太麻烦了 可以这样
let a : number = 1 // 这样是不是就好了 但是 还是太麻烦了 倒不如想js 那也 写 ts当然支持
let c = '1' // 当第一次赋值为字符串的时候 再次赋值的时候必须是 字符串
c = 2 // 这个时候就会报错了
// 引用类型 两种方式都可以用
let list: number[] = [1, 2, 3]; // 数字类型的字符串
let list: Array<string> = ['1', '2', '3']; // 字符串类型的数组
let p : string | number // 表示 可以在两个中选择一个 类型
好 现在还差 对象和函数 但是说他们之前 我要先说 Any( 任何的) 和 unknown
(未知的)
官网是这样说Any的: 有时候 ,我们会想要为那些在编程阶段还不清楚类型的变量指定一个类型。 这些值可能来自于动态的内容,比如来自用户输入或第三方代码库。 这种情况下,我们不希望类型检查器对这些值进行检查而是直接让它们通过编译阶段的检查。 那么我们可以使用 any
类型来标记这些变量:
let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false; // 当然是布尔值
那么好 我们就当他放个屁 反正也看不懂
其实Any 是表示任意数据类型 一个变量设置any后相当于 关闭了 TS的类型检测 在使用 ts的时候 不建议使用 因为 用了 就与 js 没区别 如果生命变量不赋值 那么 这个变量就是any类型
let b ; //隐式 any
let a : any ; 显示 any
这两种 情况我们要避免 (不到万不得已 不要用)
unknown
:就像所有类型都可以被归为 any
,所有类型也都可以被归为 unknown
。这使得 unknown
成为 TypeScript 类型系统的另一种顶级类型(另一种是 any
)
let value: unknown;
let value1: unknown = value; // OK
let value2: any = value; // OK
let value3: boolean = value; // Error
let value4: number = value; // Error
let value5: string = value; // Error
let value6: object = value; // Error
let value7: any[] = value; // Error
let value8: Function = value; // Error
unknown
类型只能被赋值给 any
类型和 unknown
类型本身。直观的说,这是有道理的:只有能够保存任意类型值的容器才能保存 unknown
类型的值。毕竟我们不知道变量 value
中存储了什么类型的值。
学艺不精看了一下别人的文章 跳转到
就不过多阐述了 插一嘴 记得看看 类型断言
Void类型 用来表示空 以函数为例 就表示没有返回值的函数 上 代码
never 表示 永远不会返回结果
function fn () : void { } // 没有返回值的函数
function fn2 () :never {} // 这never 就是 空都没有 undefined 都没有 用于报错 代码理解结束 没有返回值
Object 类型:
在开发时候 我们不回去 let o : object 用我引用类型都是对象 而我们想限制的则是对象中的属性
let o : {} 这样写 就与上面的区别巨大 上代码
let b :{name:string} // 这样 name 属性是必须额属性 对象内可以写多个 但是这个结构必须要跟 赋值的结构一模一样
b = {name:'孙悟空'}
b = {} // 这样会报错
let b :{name:string , age?:string} // 那在属性后面加了? 则证明这个属性是可选的
b = {name:'孙悟空'}
b = {name:'孙悟空' , age:'1'} // 有没有 age都可以
let b :{name:string ,[propName:strinbg]:any} // 后面就可以 写无限个属性 propName只是个变量名 咋写都行 [propName:strinbg]:any 属性必须是个字符串 有多少属性我不管
b = {name:'孙悟空' , age:'1', XXX :'XXX' ......} 无限个属性
let p : {name:'string'} & {age:'number'} // 这个 & 表示 对象内要有 name 为 string 的属性 还要有 age 为 number 的属性
这个跟 function 是差不多的
// 函数有两个参数(是数字) 返回值也必须是 数字 c参数 的话 type 跟对象类型的结构是 一样的
let d : (a:number , b:number) => number
d = function(n1,n2) {
retunr n1+n2
}
通过 箭头函数 来设计函数的结构数据类型
Array 我们在声明数组的时候 数组里是什么类型的值
//这就表示 字符串的数组
let e : string[]
e = ['1','2','3']
//这就表示 数字的数组
let e : number[]
e = [1,2,3]
// 声明数组的第二种写法
let list: Array<number> = [1, 2, 3];
元组 Tuple: 固定长度的数组
let h : ['string' ,'string'] // 这样的话 h 的数组必须是 两个 字符串 后面无线加
let h : ['string' ,'number'] // 这样的话 h 的数组必须是 一个是字符串 一个是数字
enum 枚举
// 定义枚举的值
enum Gender {
Male = 0,
female = 1
}
let i :{name:string, gender:Gender} // 使用枚举的地方
i= {
name :"孙悟空",
gender :Gender.Male // 进行枚举 在ts进行转化的时候 就是 0 了
}
console.log(i.gender === Gender.Male)
类型的别名 比如 在代码里边看代码边说吧
let k :1|2|3|4|5
let j :1|2|3|4|5
type MyType = 1|2|3|4|5
type Mystring = string
let p : MyType
let l : Mystring
l = '1'