let name:string='张三'let age:number=25let isMarriage:boolean=true// 在大多数情况下,这不是必需的。 TypeScript 会尽可能地尝试自动推断代码中的类型。
2. 数组
let books:string[]=['三国演义','红楼梦']let nums:Array<number>=[28,35]
3. any
let obj:any={ x:1}// 当你不想写出一个长类型来让 TypeScript 相信特定的代码行是可以的时,any 类型很有用。
4. 函数
functiongreet(name:string){console.log("Hello, "+ name.toUpperCase()+"!!");}functionprintCoord(pt:{ x:number; y:number}){console.log("The coordinate's x value is "+ pt.x);console.log("The coordinate's y value is "+ pt.y);}// 可选属性: 对象类型还可以指定它们的部分或全部属性是可选的。 为此,请在属性名称后添加 ?functionprintName(obj:{ first:string; last?:string}){// ...}
5. 联合类型
functionprintId(id:number|string){if(typeof id ==="string"){// In this branch, id is of type 'string'console.log(id.toUpperCase());}else{// Here, id is of type 'number'console.log(id);}}functionwelcomePeople(x:string[]|string){if(Array.isArray(x)){// Here: 'x' is 'string[]'console.log("Hello, "+ x.join(" and "));}else{// Here: 'x' is 'string'console.log("Welcome lone traveler "+ x);}}// 有时你会有一个联合,所有成员都有共同点。 例如,数组和字符串都有一个 slice 方法。 如果联合中的每个成员都有一个共同的属性,则可以使用该属性而不会缩小类型:functiongetFirstThree(x:number[]|string){return x.slice(0,3);}
6. 类型别名
typePoint={
x:number;
y:number;};// Exactly the same as the earlier examplefunctionprintCoord(pt: Point){console.log("The coordinate's x value is "+ pt.x);console.log("The coordinate's y value is "+ pt.y);}
7. 接口
interfacePoint{
x:number;
y:number}functionprintCoord(pt: Point){console.log("The coordinate's x value is "+ pt.x);console.log("The coordinate's y value is "+ pt.y);}// 类型别名和接口的区别// 1. 扩展接口// 1.1 InterfaceinterfaceAnimal{
name:string}interfaceBearextendsAnimal{
honey:boolean}const bear =getBear()
bear.name;
bear.honey;// 1.2 Type(通过交集扩展类型)typeAnimal{
name:string;}typeBear= Animal &{
honey:boolean;}const bear =getBear()
bear.name;
bear.honey;// 2. 添加新字段// 2.1 Interface 向现有接口添加新字段interfaceWindow{
title:string;}interfaceWindow{
ts: TypeScriptAPI;}const src ='const a = "hello world"';
window.ts.transpileModule(src,{});// 2.2 type类型创建后无法更改typeWindow={
title:string;}typeWindow={
ts: TypeScriptAPI;}// Error: Duplicate identifier 'Window'.
类型断言
// 有时你会得到关于 TypeScript 无法知道的值类型的信息。// 例如,如果你使用的是 document.getElementById,TypeScript 只知道这将返回某种 HTMLElement,但你可能知道你的页面将始终具有具有给定 ID 的 HTMLCanvasElement。// 在这种情况下,你可以使用类型断言来指定更具体的类型:const myCanvas = document.getElementById("main_canvas")as HTMLCanvasElement;// 或const myCanvas =<HTMLCanvasElement>document.getElementById("main_canvas");// TypeScript 只允许类型断言转换为更具体或更不具体的类型版本。 此规则可防止 “impossible” 强制,例如:const x ="hello"asnumber;// Conversion of type 'string' to type 'number' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first.// 有时,此规则可能过于保守,并且不允许可能有效的更复杂的强制转换。 如果发生这种情况,你可以使用两个断言,首先是 any(或 unknown,我们稍后会介绍),然后是所需的类型:const a = expr asanyasT;
字面类型
// 就其本身而言,字面类型并不是很有价值:let x:"hello"="hello";// OK
x ="hello";// ...
x ="howdy";// Type '"howdy"' is not assignable to type '"hello"'.// 但是通过将字面组合成联合,你可以表达一个更有用的概念 - 例如,只接受一组已知值的函数:functionprintText(s:string, alignment:"left"|"right"|"center"){// ...}// 数字字面类型的工作方式相同:functioncompare(a:string, b:string):-1|0|1{return a === b ?0: a > b ?1:-1;}// 与非字面类型结合使用:interfaceOptions{
width:number;}functionconfigure(x: Options |"auto"){// ...}configure({ width:100});configure("auto");configure("automatic");// Argument of type '"automatic"' is not assignable to parameter of type 'Options | "auto"'.
字面推断
declarefunctionhandleRequest(url:string, method:"GET"|"POST"):void;const req ={ url:"https://example.com", method:"GET"};handleRequest(req.url, req.method);// Argument of type 'string' is not assignable to parameter of type '"GET" | "POST"'.// 就是说req.method会被推断为string类型,而不是“GET”,可能在其他地方将其改成“GET”、“POST”之外的字段,从而导致与handleRequest参数类型不符// 解决办法// 1. 通过在任意位置添加类型断言来更改推断:// Change 1:const req ={ url:"https://example.com", method:"GET"as"GET"};// Change 2handleRequest(req.url, req.method as"GET");// 更改 1 表示 “我打算让 req.method 始终具有 _ 字面类型 _"GET"“,防止之后可能将 "GUESS" 分配给该字段。 更改 2 表示 “由于其他原因,我知道 req.method 的值为 "GET"“。// 2. 可以使用 as const 将整个对象转换为类型字面const req ={ url:"https://example.com", method:"GET"}asconst;handleRequest(req.url, req.method);// as const 后缀的作用类似于 const,但用于类型系统,确保为所有属性分配字面类型,而不是更通用的版本,如 string 或 number。