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});

}

}