ts的基本数据类型
1.布尔 boolean true/false
let isDone:boolean = false
2.数字 ts里数字都是浮点数 number 十进制 十六进制 二进制 八进制
3.字符串
形式1:引号 ' "" 和js一样 let name:string='bb'+myName
形式2:模板字符串(多行文本和内嵌表达式) ` ${} let name:string= `我的名字是${myName}`
4.数组
形式1:在元素类型后面接上[],表示由此类型元素组成的一个数组:let list:number[] = [1,2,3]
形式2:使用数组泛型,Array<元素类型> let list:Array<number> = [1,2,3]
定义时的元素类型和赋值时要一致,否则会报错
5.元组 Tuple
元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同 可以定义一对值分别为string\number类型的元组
注意:1)定义时的类型顺序和赋值时应一致,不然会报错
2)当访问一个已知索引的元素,会得到正确的类型
3)当访问一个越界的元素,会使用联合类型替代
注意:在 Typescript 2.7 Tuple 的定义已经变成了有限制长度的数组 不能再越界访问了 官方文档没更新
push可以成功,访问数组也能看到这个元素,但是通过索引取不了
索引不能获取是静态检查不让你获取而已,实际上运行时还是能的。静态检查对运行时不会有任何影响。
typescript的静态类型并不属于强类型,就算声明约束为长度2的数组,它仍然可以push,因为它始终还是js。
所以typescript能做的就是在你尽管对数组的操作超越了约束,它还是限制你继续在约束范围外进行其他操作。
let x: [string, number]
x = ['hi', 10] //(2) ["hi", 10]
x = [10, 'jjj'] //error TS2322: Type 'number' is not assignable to type 'string'.
console.log('----', x[0].substr(1)) //i substr(start,length) 如果第二个参数没传,默认到最后
console.log(x[1].substr(1)) //类型“number”上不存在属性“substr”
6.枚举 enum类型是js标准数据类型的一个补充
1)使用枚举类型可以为一组数值赋予友好的名字
2)默认情况下,从0开始为元素编号,也可以手动指定成员的数值
enum Color { Red = 1, Green = 2, Blue = 3,}
3)可以由枚举的值得到它的名字 这里限定数据类型是你前面定义的那个
let c: Color = Color.Green //结果是值
4)知道值 可以以查到映射对应的名字 这里要限定数据类型是string,等号右边的值是字符串
let e: Color = Color[3] //不能将类型“string”分配给类型“Color”。
let d: string = Color[3]//Blue
enum Color { Red = 1, Green = 2, Blue = 3,}
let c: Color = Color.Green
console.log(c) //2
// let e: Color = Color[3] //不能将类型“string”分配给类型“Color”。
let d: string = Color[3]
console.log(d) //blue
7.Any
为在编程阶段还不清楚类型的变量指定一个类型(值可能来自于动态的内容 第三方代码库、用户输入)
不希望类型检查器对这些值进行检查而是直接让它们通过编译阶段的检查=》用any类型标记该变量
1)不知道变量是什么数据类型
let notSure: any = 4
console.log(notSure) //4
notSure = 'hhhhhhhhh'
console.log(notSure) //hhhhhhhhh
notSure = false
console.log(notSure) //false
2)改写现有代码
允许在编译时可选择的包含或移除类型检查 object类型的变量只允许给它赋任意值 但不能在它上面调用任意的方法 即使它真的有这些方法
let notSure: any = 4
notSure.ifItExisits() //浏览器报错了,vscode没有 jc1.js:179 Uncaught TypeError: notSure.ifItExisits is not a function
notSure.toFixed() //没报错
let prettySure: Object = 4
prettySure.toFixed() //vscode直接报错 类型“Object”上不存在属性“toFixed”
3)只知道部分数据的类型时 比如数值包含不同类型的数据
let list: any[] = [1, true, 'free']
list[1] = 100 //vs没报错 没指定数值元素的数据类型
8.Void
void类型与any类型相反,表示 没有任何类型
1) 当一个函数没有返回值时,其返回值类型是void
function warnUser(): void {
console.log('message')
}
2)声明一个void类型的变量没有大用,只能赋值为undefined null
let unusable: void = undefined
let unusable0: void = null
let unusable1: void = 1 //不能将类型“number”分配给类型“void”。
let unusable2: void = [1, 2] //不能将类型“number[]”分配给类型“void”。
9.null\undefined
1.默认情况下null和undefined是所有类型的子类型,就是说 你可以把null undefined赋值给number类的变量
2.如果指定了 --strictNullChecks标记,null\undefined只能赋值给void和它们各自
如果想传一个string null 或undefined,可以使用【联合类型】string|null|undefined
let u:undefined = undefined;
let:null = null;
10.Never
1)表示永不存在的值的类型
--never类型是那些总是会抛出异常或者根本就不会有返回值的函数表达式或箭头函数表达式的返回值的类型
--变量也可能是never类型,当它们被永不为真的类型保护所约束时
2)never类型是任何类型的子类型,也可以赋值给任何类型
但是,只有never可以赋值给never 没有类型是never的子类型或可以赋值给never类型(除了never本身之外),any也不可以赋值给never
// 返回never的函数必须存在无法达到的终点
function error(message: string): never {
throw new Error(message)
}
// 推断的返回值类型为never
function fail() {
return error('Something failed')
}
// 返回never的函数必须存在无法达到的终点 死循环
function infiniteLoop(): never {
while (true) {}
}
11.object
表示非原始类型, 除number string boolean symbol null undefined之外的类型
使用object类型可以更好的表示像Object.create这样的API
declare function create(o: object | null): void
create({ prop: 0 })
create(null)
// create(3) //类型“number”的参数不能赋给类型“object”的参数。
// create('string') // Error
// create(false) // Error
//和文档例子不同
create(undefined) // 默认情况下null和undefined是所有类型的子类型
类型断言
-只在编译阶段起作用 ts会假设你已经进行了必须的检查
形式1:尖括号语法
let someValue:any = "hihi";
let strLength:number = (<string>someValue).length
形式2: as语法 在ts里使用JSX时,只允许as语法断言
let someValue:any = 'hhhhh';
let strLength:number = (someValue as string).length;
关于let
用let代替var