TypeScript基本语法
TypeScript的类型声明
typeScript这个是强类型的js。类型检查,静态分析是它的强项。
function greeter(person: string) {
return “Hello, “ + person;
}
let user = “Jane User”;
document.body.textContent = greeter(user);
let user = 123; //这样会报错!
document.body.textContent = greeter(user);
这是最普通的类型声明
还有类似C++的struct一样的
interface Person {
firstName: string;
lastName: string;
}
let user = { firstName: “Jane”, lastName: “User” };
还有类的声明
class Student {
fullName: string;
constructor(
public firstName: string,
public middleInitial: string,
public lastName: string
) {
this.fullName = firstName + “ “ + middleInitial + “ “ + lastName;
}
}
let user = new Student(“Jane”, “M.”, “User”);
为什么类型系统那么重要,因为js是运行时检查类型,这样写完错误实际很多,编译时能够过滤掉很多的错误,不需要到运行时来解决。
类型检查,静态检查,帮助TypeScript解决了很多编译时就应该过滤掉的很多小问题如:
1 书写错误
2 不可调函数
3 基础的逻辑错误
TypeScript简单语法
https://www.runoob.com/typescript/ts-basic-syntax.html
TypeScript的语法基本和许多语言都保持了一致性。
主要讲述一些问题:
1 比如在ts里面声明了一个类,然后使用 var obj = new className(); 是怎么分配内存的?
原因是TS里面有垃圾回收机制,会把该对象分配到堆上。
2 ts的number的双精度 64 位浮点值存有多少字节?
8 字节
3 TypeScript 的 any 类型是不是运行时的?
any 类型会使 TypeScript 放弃类型检查。因此,any 类型本质上是编译时的概念,而不是运行时的。然而,any 类型允许在运行时赋予变量任何类型的值。
4 TypeScript 的 string 类型存多少位?
TypeScript 的 string 类型表示 UTF-16 编码的字符串,每个字符占用 2 字节(16 位)。具体存储多少位取决于字符串的长度。
5 TypeScript 的 let、var 和 const 区别在哪?
var 函数作用域或全局作用域(没有块级作用域),可以不初始化
let 作用域是块级作用域,可以不初始化
const 作用域是块级作用域,必须初始化
6 TypeScript 的 boolean 类型是几位?
它取决于 JavaScript 引擎的实现。在底层,布尔值通常被优化存储,可以只占用 1 位,但在实际内存分配中,可能占用 1 个字节或更多。
7 TypeScript 有指针这个概念么?
TypeScript 没有指针的概念,所以默认传入引用,非值传递。
8 TypeScript 在声明的时候不写类型和写好类型是不是速度不一样?
类型声明主要在编译时起作用,而不是在运行时。因此,声明时写类型和不写类型对运行时速度没有影响。但是,显式类型可以帮助编译器更快地进行类型检查和推断,从而可能在编译速度上有差异。
9 TypeScript 声明了一个值没有初始化所以是 undefined?
如果声明了一个变量但没有对其进行初始化,该变量的值默认为 undefined。
10 TypeScript 抛异常是不是在函数返回一个 never?
是的,在 TypeScript 中,抛出异常的函数被认为是返回类型 never。never 类型表示函数永远不会成功地返回(因为它会抛出异常或进入无限循环)。
11 TypeScript 有哈希表之类的数据结构么?
TypeScript 作为一种类型系统,在其标准库中没有提供专门的哈希表数据结构。但是,JavaScript 的 Object 和 Map 可以用来实现哈希表的功能。
Object: 使用键值对存储数据,但键必须是字符串或符号。
Map: 允许使用任意值作为键,并保持插入顺序。
let obj: { [key: string]: number } = {};
obj[“key1”] = 1;
let map = new Map<string, number>();
map.set(“key1”, 1);
12 TypeScript 有多少种循环方式,一般循环数组和集合要用哪种?
有五种循环:
for 循环
for…of 循环
for…in 循环
while 循环
do…while 循环
ForEach的循环
numbers.forEach(num => {
console.log(num);
});
for … in 的循环
let obj = {a: 1, b: 2, c: 3};
for (let key in obj) {
console.log(key, obj[key]);
}
13 Lambda 函数如何声明?
//简洁的形式
let add = (a: number, b: number): number => a + b;
14 TypeScript 支持函数重载么?
支持
15 有哪些 TypeScript 对象允许添加 prototype?
允许所有的类都添加 prototype 属性
class Person {
name: string;
constructor(name: string) {
this.name = name;
}
}
Person.prototype.greet = function() {
console.log(Hello, my name is ${this.name}
);
};
let person = new Person(“Alice”);
(person as any).greet(); // 输出: Hello, my name is Alice
16 TypeScript 的 Array 可以是动态数组么,可以添加元素么?
是的,TypeScript 的 Array 是动态数组,可以添加元素:
let numbers: number[] = [1, 2, 3];
numbers.push(4);
console.log(numbers); // 输出: [1, 2, 3, 4]
17 如何判断类型?
使用 typeof 操作符判断基本类型:
let x: any = “hello”;
if (typeof x === “string”) {
console.log(“x 是一个字符串”);
}
使用 instanceof 操作符判断对象类型
class Person {
name: string;
constructor(name: string) {
this.name = name;
}
}
let person = new Person(“Alice”);
if (person instanceof Person) {
console.log(“person 是 Person 类的实例”);
}
18 TypeScript 的 interface 声明了函数哪里去实现函数?
在 TypeScript 中,interface 只定义函数的签名,不包含具体实现。函数的实现是在实现该接口的类或对象中:
interface Greetable {
greet(message: string): void;
}
class Person implements Greetable {
name: string;
constructor(name: string) {
this.name = name;
}
greet(message: string): void {
console.log(${this.name} says: ${message}
);
}
}
let person = new Person(“Alice”);
person.greet(“Hello!”); // 输出: Alice says: Hello!
19 TypeScript 的类构造函数是怎么样的?
TypeScript 的类构造函数使用 constructor 关键字定义:
class Person {
name: string;
constructor(name: string) {
this.name = name;
}
greet(): void {
console.log(Hello, my name is ${this.name}
);
}
}