概念:
TS: JavaScript with syntax for types
一种带类型语法的JS,为解决原生JS弱类型安全问题,提高结果可信度和代码维护性,便于模块化开发。
安装:
npm install -g typescript
速通基本语法:
参考官网文档:TypeScript 手册 (nodejs.cn)
体验:原js因为类型问题,在console输出的结果很怪(这些原本不该成立或者应该报错更为合理):
""==0 // true
x = true
1<x<3 // true
4/[] // Infinity
TS语法:
-
类型注解
// 变量注释 let myName: string = "Alice"; // 函数入参,返回值注释 function getUserName(userId: number) :string{return `name_${userId}` }
-
静态类型检测
const message = "hello!";message(); // Error Type 'String' has no call signatures.
-
非异常故障
const user = {} user.name // js环境 undefined ; ts环境报错:Property 'location' does not exist on type ...
-
对象类型
// pt为x,y的字典对象 function printCoord(pt: { x: number; y: number }) {console.log("x value is " + pt.x);console.log("y value is " + pt.y); } printCoord({ x: 3, y: 7 });// 可选的对象类型,加上? 标识 function printName(obj: { a: string; b?: string }) {// ... } // Both OK printName({ a: "Bob" }); printName({ a: "Alice", b: "Alisson" });
如果两个对象具有相同的形状,则认为它们属于同一类型
interface Point { x: number; y: number; }function logPoint(p: Point) { console.log(`${p.x}, ${p.y}`); }// 这里point不需要定义为Point类型也可使用 const point = { x: 12, y: 26 }; logPoint(point);# 类对象的形式 class VirtualPoint { x: number; y: number;constructor(x: number, y: number) {this.x = x;this.y = y; } }const newVPoint = new VirtualPoint(13, 56); logPoint(newVPoint); // logs "13, 56"
-
自动推断类型:
let a = 'ss'
-
类型别名 (自己组合一个类型)
type User = {name: string;id: number; }; const user:User = {name:"Name",id:0}; // 扩展类型用交叉扩展 type SuperUser = User & {isSuperUser: boolean; }const user2:SuperUser = {name:"Name",id:0, isSuperUser:true};
-
接口类型
和类型别名很像,但是接口类型可以被继承后,新增其他属性,类别不行。interface User { name: string; id: number; }; const user:User = {name:"Name",id:0}; // 扩展属性通过继承 interface SuperUser extends User{ isSuperUser: boolean; } const user:SuperUser = {name:"Name",id:0,isSuperUser:true};
-
字面类型(可做出参数枚举效果)
// 限制alignment只能传入"left","right","center"function printText(s: string, alignment: "left" | "right" | "center") {// ...}printText("Hello, world", "left");
-
枚举类型
enum Color {Red, Green, Blue}; let c: Color = Color.Green;
-
组合类型:
-
联合类型
// obj参数可以接受 string或者string数组 function getLength(obj: string | string[]) {return obj.length; }
-
泛型:
为类型提供变量
type StringArray = Array<string>; type NumberArray = Array<number>; type ObjectWithNameArray = Array<{ name: string }>;
- 类
class Greeter { greeting: string; constructor(message: string) { this.greeting = message; } greet() { return "Hello, " + this.greeting; } } let greeter = new Greeter("world");
- 泛型(Generics)
泛型允许你定义组件时,不具体指定组件工作的具体类型,而是在组件被使用的时候才指定。function identity<T>(arg: T): T { return arg; } let output = identity<string>("myString"); let outputNum = identity<number>(42);