type和接口interface的区别
type和interface都可以用来定义类型,都可以定义对象和函数;都可以继承或扩展其他类型,但语法不一样;都支持泛型。
不同点:
type可以定义基本类型、联合类型、元组等,也可以定义复杂的类型别名;而interface只能定义对象类型。
type可以使用交叉类型(&)将多个类型合并成一个类型;而interface不支持交叉类,但可以用extends关键词继承。
type的类型别名可以使用typeof获取已有类型的类型,interface不支持这种方式
// 当你想获取一个变量的类型时,使用 typeof
let div = document.createElement('div');
type B = typeof div
any和unknow的区别
any: any类型表示任何类型都可以,即该值可以是任何类型,包括基本类型、对象类型、函数类型等。any类型的变量可以被赋予任何值,它可以调用任何方法或属性,TypeScript编译器不会检查它的类型和属性的合法性,所以使用any类型会降低代码的类型安全性。
let a: any = '123';
console.log(a.toUpperCase()); // 没有编译错误,但是在运行时会抛出错误,因为a是字符串类型,而字符串类型没有toUpperCase方法
unknown: unknown类型表示类型未知的值,即我们不知道它的具体类型是什么。与any不同的是,使用unknown类型时,必须要进行类型检查或者类型断言才能使用它的属性和方法,否则会产生编译错误。unknown类型可以被赋值给任何类型,但是只有any类型可以被赋值给unknown类型,因为any类型包含了所有类型,而unknown类型则不包含任何类型。
let b: unknown = '123';
console.log(b.toUpperCase()); // 编译错误,因为b的类型为unknown,需要进行类型检查或者类型断言
console.log((b as string).toUpperCase()); // 进行类型断言后,可以调用字符串的toUpperCase方法
if (typeof b === 'string') {
console.log(b.toUpperCase()); // 使用typeof进行类型检查后,也可以调用字符串的toUpperCase方法
}
需要注意的是,当使用any类型时,可以将任何值赋值给该类型,但是当使用unknown类型时,
只有any类型可以被赋值给unknown类型,因为any类型包含了所有类型。例如:
let c: any = '123';
let d: unknown = '456';
d = c; // 编译通过,因为any类型可以赋值给unknown类型
c = d; // 编译通过,因为任何类型都可以赋值给any类型
在实际应用中,应尽量避免使用any类型,而使用unknown类型可以提高代码的类型安全性。当需要处理类型不确定的值时,应首选unknown类型。
说一下ts的理解,和js的区别
TypeScript(简称 TS)是一种开源的编程语言,是 JavaScript 的一个超集,可以编译成纯 JavaScript 代码,由微软开发和维护。
TypeScript 在 JavaScript 的基础上增加了一些静态类型、类、接口、泛型等特性,使得它更适合大型复杂项目的开发。使用 TypeScript 可以提高代码的可维护性、可读性和可靠性。
与 JavaScript 相比,TypeScript 的主要区别在于它是静态类型的。JavaScript 是一种动态类型的语言,即变量的类型是在运行时确定的,而 TypeScript 在编译时就能够确定变量的类型,从而可以在开发过程中检测出类型错误,提高代码的可靠性。
另外,TypeScript 的语法比 JavaScript 更加严格,例如必须声明变量的类型、函数参数必须传递等。这些约束可以使开发者编写更加规范的代码,并避免一些常见的编程错误。
总之,TypeScript 在保留 JavaScript 的灵活性和易用性的基础上,为开发大型、复杂的应用程序提供了更多的工具和特性,使得开发过程更加可靠和高效。
内置数据类型有哪些
boolean: 代表 true 或 false。
number: 代表数字,包括整数和浮点数。
string: 代表字符串。
void: 表示没有任何类型,通常用于函数没有返回值的情况。
null 和 undefined: 表示 null 和 undefined 值。
any: 表示任意类型的值,不受类型检查。
never: 表示永远不存在的值的类型,通常用于抛出异常或死循环等场景。
object: 代表非原始类型的值,也就是除 number、string、boolean、symbol、null 或 undefined 以外的类型,比如数组、函数、类等。
Tuple:表示一个固定长度的数组类型,其中每个元素的类型可以不同。
Enum:表示一组有名字的常量集合,可以为枚举成员指定数值,也可以让TS自动为枚举成员指定数值。
list:有两种方式可以定义数组。 第一种,可以在元素类型后面接上 [];第二种方式是使用数组泛型,Array<元素类型>
ts泛型
在TypeScript中,泛型可以让我们编写可重用、类型安全的代码,它可以让我们在编写代码时不预先指定具体的类型,而是在使用的时候再指定类型。泛型通常用于函数和类中,以处理不同类型的数据。
以下是一个泛型函数的例子:
function reverse<T>(arr: T[]): T[] {
return arr.reverse();
}
let nums = [1, 2, 3, 4];
let reversedNums = reverse<number>(nums);
console.log(reversedNums); // [4, 3, 2, 1]
let names = ["Alice", "Bob", "Charlie"];
let reversedNames = reverse<string>(names);
console.log(reversedNames); // ["Charlie", "Bob", "Alice"]
ts优缺点
优点:
增强代码的可读性和维护性,在编译的时候就能发现大部分的问题。
类型推导,自动补全,提升开发效率。
静态类型,变量类型可预测
缺点:
1、增加学习成本,需要理解接口和泛型这些。
2、短期增加开发成本,但减少debug和后期维护成本。
3、需要编译,类型检查会增加编译时长,语法和类型系统复杂的话时间特别长。
4、和有些库结合时不是很完美。
5、不是真正的静态类型,可以用 any 类型,也可以进行类型的强制转换。