前言
TypeScript 是一种基于 JavaScript 的编程语言,它提供了丰富的数据类型,包括基本类型、高级类型和特殊类型。本文将介绍其中一些常用的类型,包括 any 类型、unknown 类型、void 类型、never 类型、tuple 类型、function 类型、class 类型和 union 类型。
any 类型
any 类型是一种特殊类型,它可以表示任何类型的值,即在编写代码时不进行类型检查,允许任何类型的值传递给任何变量或函数参数。使用 any 类型可以方便地处理动态类型数据和第三方库的类型问题,但也会导致类型安全问题。
let message:any = "hello wrold"
message=123
message=true
message={
}
console.log(message);
复制代码
unknown 类型
unknown 类型是 TypeScript 3.0 中引入的新类型,它与 any 类型类似,也可以表示任何类型的值,但需要在使用前进行类型检查,用于描述类型不确定的变量。使用 unknown 类型可以确保类型安全,避免在运行时出现类型错误。与 any 类型不同,unknown 类型不允许进行任何操作,只有在进行类型检查后才能进行操作。
function foo() {
return "abc";
}
function bar() {
return 132;
}
let flag = true;
// unknow类型只能赋值给any和unknown类型
// result变量不确定类型,有可能string或者number
let result: unknown;
if (flag) {
result = foo();
} else {
result = bar();
}
console.log(result);
复制代码
void 类型
void 类型表示函数没有返回值,通常用于定义没有返回值的函数。例如,一个函数执行某些操作但不返回任何值,可以使用 void 类型来定义。
// 没有返回值void可写可不写,
// 没有返回值默认返回undefined
function sum(num1: number, num2: number): void {
console.log(num1 + num2);
}
// 定义返回值类型
function sum2(num1: number, num2: number): number {
return num1 + num2;
}
复制代码
never 类型
never 类型表示一个永远不会有返回值的函数或表达式,通常用于表示不可能到达的代码段。例如,在一个函数中抛出异常或进入无限循环,都会导致函数返回 never 类型。
// 死循环
function foo(): never {
while (true) {}
}
// never应用在什么场景?
// 来着知乎的一个案例
// 运行直接报错,提示case要加上boolean
function handlerMessage(message: string | number | boolean) {
switch (typeof message) {
case "string":
console.log("string");
break;
case "number":
console.log("number");
break;
default:
const check: never = message;
}
}
handlerMessage("123");
handlerMessage(123);
handlerMessage(true); // 报错
复制代码
tuple 类型
tuple 类型表示一个有序的固定长度数组,其中每个元素可以是不同的类型。例如,一个长度为 2 的 tuple 类型可以定义为[string, number],其中第一个元素是字符串类型,第二个元素是数字类型。
//tuple元组:多种元素的组合
const info: any[] = ["why", 18, 1.88];
const name = info[0]; //any类型,无法得到拿到的元素的类型
//元组写法
const info1: [string, number, number] = ["abc", 18, 1.88];
const name1 = info1[0]; //string类型
//应用场景
function useState<T>(state: T) {
//any全替换成T
let currentState = state;
const changeState = (newState: T) => {
currentState = newState;
};
//第一个any类型,第二个数组类型
const tuple: [T, (newState: T) => void] = [currentState, changeState];
return tuple;
}
const [counter, setCounter] = useState(10);
setCounter(1000);
const [title, setTitle] = useState("abc");
const [flag, setFlag] = useState(true);
复制代码
function 类型
function 类型表示函数类型,可以用来定义函数的输入参数和返回值类型。例如,一个函数的类型可以定义为(number, string) => boolean,表示该函数接受一个数字和一个字符串作为参数,返回一个布尔值。
//给参数加类型注解
//默认返回值void,不写返回值类型会自动推导
function sum(num1: number, num2: number): number {
return num1 + num2;
}
//匿名函数的参数类型
//可写可不写,item根据上下文环境推导出来,可以不添加类型注解
const names = ["abc", "cba", "bac"];
names.forEach((item) => {
console.log(item);
});
复制代码
object 类型
function printPoint(point: { x: number; y: number }) {
console.log(point.x);
console.log(point.y);
}
printPoint({ x: 123, y: 456 });
//可选类型加?可传可不传
function printPoint1(point: { x: number; y: number; z?: number }) {
console.log(point.x);
console.log(point.y);
console.log(point.z);
}
printPoint1({ x: 123, y: 456 });
printPoint1({ x: 123, y: 456, z: 789 });
复制代码
union 类型
union 类型表示一个值可以是多种类型中的一种。例如,一个变量可以定义为 string | number,表示该变量可以是字符串类型或数字类型。
总之,TypeScript 提供了丰富的数据类型,包括基本类型、高级类型和特殊类型。开发人员可以根据实际需求选择合适的数据类型,提高代码的可读性、可维护性和可靠性。
//联合类型由两个或多个其他类型组成的类型,可以是这些类型中的任何一个值
function printId(id:number | string){ //联合类型
//narrow:缩小
if(typeof id == 'string'){
console.log(id.toUpperCase());
}else{
console.log(id);
}
}
printId(123)
printId("123")
//参数可选可不选
//一个参数一个可选类型的时候,本质上表示这个参数是 类型|undefined 的联合类型
function foo(message?:string){ //string | undefined
console.log(message);
}
foo()
foo("123")
//type定义类型别名
type IDtype = string | number | boolean
function p(id:IDtype){
}
type Ptype = {
x:number,
y:number,
z:number
}
function p2(point:Ptype){
}
复制代码
评论