TypeScript系列文章
可浏览博客主页的TypeScript专栏,会陆续添加相关文章,有问题或者可以优化的地方也希望大大门告知
共同进步 :)
文章目录
TypeScript 数据类型
版本 Version 4.8.4
TypeScript 数据类型:为了让程序有价值,我们需要能够处理最简单的数据单元:数字,字符串,结构体,布尔值等。 TypeScript支持与JavaScript几乎相同的数据类型,此外还提供了实用的枚举类型方便我们使用。
0 字面量类型
let a:1;
a=1;
// error!~
a=2;
1 布尔型-boolean
var isDone: boolean = false;
2 数值-number
// 10进制
let decLiteral: number = 6;
// 16进制
let hexLiteral: number = 0xf00d;
// 2进制
let binaryLiteral: number = 0b1010;
// 8进制
let octalLiteral: number = 0o744;
3 字符串-string
let name: string = "bob";
4 数组(可限制类型)
// 数组泛型
let list: Array<any> = [1, true, "free"];
// 元素类型后面接上 []
let list2: any[] = [1, true, "free"];
5 元组
元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。
// Declare a tuple type
let x: [string, number];
// Initialize it
x = ["hello", 10]; // OK
// x = [10, 'hello']; // Error
// 当访问一个越界的元素,vscode编辑器会提示错误 例如:console.log(x[5]);
6 枚举
// 编号默认从0开始
// 也可以手动赋值
// 如果当前枚举值没有赋值,上一个必须为数值类型,当前枚举值会自动+1
enum Color {
Red = 2,
Green = 1,
Blue, // 根据上一个枚举值自动加1
Yellow="111", // 可以赋值为字符串
Black="5" //必须赋值,不然会报错
}
let c: Color = Color.Blue;
console.log("Color.Red:",Color.Red);
console.log("Color.Green:",Color.Green);
console.log("Color.Blue:",Color.Blue);
console.log("Color.Yellow:",Color.Yellow);
console.log("Color.Black:",Color.Black);
7 any和unknown
// any 跟 unknown 都表示任何类型,可以相互赋值~
// 有些教程说不可以,这个也要看TS版本
// any 表示任何,对于那些不确定类型的值可以用,对现有代码进行改进也可以用,但是避免使用,不然还不如用JS写
var a: any = "hello";
var b: unknown = 123;
b = a;
a = b;
那any和unknown之间有什么区别呢?
let a:any='hello';
let b:unknown='hello';
let str:string;
str=a;
// error!!! unknown 不能直接给其他变量赋值
str=b;
// unknown 是安全的任意类型,因为他不能直接给其他变量赋值
// 需要经过判断数据类型或者通过断言的方式
if(typeof b == 'string'){
str=b;
}
str=b as string;
str=<string>b;
当你没有指定类型,并且 TypeScript 不能从上下文推断它时,编译器通常会默认为 any。
不过,你通常希望避免这种情况,因为 any 没有经过类型检查。 使用编译器标志 noImplicitAny 将任何隐式 any 标记为错误。
8 undefined和null
// undefined和null两者各自有自己的类型分别叫做undefined和null
// Not much else we can assign to these variables!
let u: undefined = undefined;
let n: null = null;
9 void和never
void 常用于函数返回值
let unusable:void = undefined;
// 无返回值
function fn():void{
return;
}
// 返回undefined
function fn2():void{
return undefined;
}
never类型表示的是那些永不存在的值的类型。
// 返回never的函数必须存在无法达到的终点
function error(message: string): never {
throw new Error(message);
}
// 推断的返回值类型为never
function fail() {
return new Error("Something failed");
}
// 返回never的函数必须存在无法达到的终点
function infiniteLoop(): never {
while (true) {}
}
// never 是任何类型的子类型,也就是说 never 可以赋值给任何类型。
const aa: number = "string" as never;
const bb: object = "" as never;
// console.log('const aa: number = "111" as never:', aa); // Success
10 object
用于设置对象的类型声明。
如果用来声明变量的类型,那就有点毫无意义,但是可以拓展开来。
可以用[propName:string]:any 表示其他属性
let person:{name:string,age?:number};
person={name:'penk',age:31}
// 如果不确定属性名可以用[propName:string]:any 表示其他属性
let person2:{name:string,[propName:string]:any};
person2={name:'penk',sex:'man'}
11 Function
用于设置函数的类型声明。
可以拓展开来,一般用于函数表达式。
限制参数类型、参数数量以及返回值类型。
// 参数a为number类型、参数b为number类型,返回类型是number类型
let add:(a:number,b:number)=>number;
add = (a:number,b:number)=>{
return a+b;
}
TypeScript 类型断言
通过类型断言这种方式可以告诉编译器,“相信我,我知道自己在干什么”。
注意:类型断言只能够「欺骗」TypeScript 编译器,无法避免运行时的错误,反而滥用类型断言可能会导致运行时错误
// “尖括号”语法
let someValue: any = "this is a string";
let strLength: number = (<string>someValue).length;
// as 语法
let someValue2: any = "this is a string";
let strLength2: number = (someValue as string).length;