TypeScript 基础知识
ts 是 js 的超集。
string, String 的区别是什么?
string, js 的基本类型。(字符串类型)
String, js 中 string 的包装类。
何时使用 string? 何时使用 String?
99% 的情况下,使用 string
let nameObj: String = new String("Alice"); 时才会使用到 String。
ts 可以使用哪些类型?
js 基本类型:string, number, bool,void, null/undefined, Symbol, bigint
ts 定义的类型: void, unknown, never, Array<number>, enum
如何初始化 tsconfig.json ?
tsc --init
TS 类型
- top type(顶级类型): any unknown
- Object
- Number String Boolean
- number string boolean
- 1 'wwww' false
- never
unknown 和 any
任何类型都可以赋值给 any, unknown 类型。
unknown 只能赋值给自身, 或者 any 类型。
let a: any = "1";
let b: unknown = 2;
let c: number = 3;
a = b;
a = c;
b = a;
b = c;
c = a;
// c = b; // unknown 类型只能赋值给 unknown 或 any 类型
console.log(c);
unknown 没有办法读任何属性, 方法也不可以。 (编译器会提示)
let w: unknown = {
name: "wangzhy",
};
// console.log(w.name); //编辑器会报错。 'w' is of type 'unknown'.
unknown 比 any 会更安全。
object, Object, 三个类型的区别
Object 表示包含了所有类型 (string, number, boolean, [], , 函数)
object 表示非原始类型 (非 string, number, boolean, bigint, Symbol, null, undefined 的类型)
{}(字面量) 表示 new Object, 等同于 Object
接口(interface)和对象类型
重名, 重合
interface 定义的结构体,在创建的时候,字段必须一致(不多不少)。
interface A {
name: string;
}
let a: A = {
name: "wang",
};
遇到重名时,会自动合并。
interface A {
name: string;
}
interface A {
age: number;
}
let a: A = {
name: "wang",
age: 123,
};
任意 key
interface A {
age: number;
// 注意, 这里 propName 要保存所有字段的类型。 比如,此代码案例中,必须包含 number 类型
[propName: string]: any;
}
interface A {
age: number;
[propName: string]: number | string;
}
let a: A = {
name: "wang",
age: 123,
aaa: "123",
};
可选字段
使用 ?
interface A {
age?: number;
[propName: string]: number | string;
}
let a: A = {
name: "wang",
aaa: "123",
};
readonly
interface A {
readonly age?: number;
[propName: string]: number | string;
}
let a: A = {
name: "wang",
age: 123,
aaa: "123",
};
// a.age = 11; // Cannot assign to 'age' because it is a read-only property.
接口继承
使用 extends 关键字
函数类型
interface Fn {
// 定义一个参数为 string 类型,返回类型为 number[] 的函数
(name: string): number[];
}
const fn: Fn = function (name: string) {
return [1];
};