TypeScript 中文教程基础部分下----翻译自TS官方
🔯 type 别名
我们已经使用过 object 和 联合的方式 直接声明类型。但是某个类型在使用多次的情况下就要用到别名了。
别名的语法就像是在定义一个具名的对象一样:
type Point = {
x: number;
y: number;
}
function printCoord(pt: Point) {
console.log(pt.x);
console.log(pt.y);
}
printCoord({ x: 100, y: 100 });
定义一个别名不仅仅可以是对象的形式,还可以是其他形式,比如联合类型
type ID = number | string;
别名仅仅只是个别名,你不能使用一个别名再去创建一个不同版本的别名但却表达同样的类型。如果你使用一个别名继续创建另一个别名,这件事就是一种重复劳动没有意义,即使能正常运行。
所以不要这样定义:
🤢 type userString = string
🔯 interfaces 接口 :是另一种用来声明 object type 的类型
interface Point {
x: number;
y: number;
}
用法不变
function printCoord(pt: Point) {
console.log(pt.x);
console.log(pt.y);
}
printCoord({ x: 100, y: 100 });
这样看起来和上面的别名是一样的,TS 只关心入参的结构是否和定义的类相匹配。但是和别名也有不同之处:
在大部分情况下别名和接口都可以选择,但是别名一旦创建后就不能再添加新的属性了,
接口是可以拓展的:接口既可以新增属性名称也可以通过 extends 进行拓展。
interface 接口 | type 别名 |
interface Animal { interface Animal { legs: number |
type Animal = { type Animal = { //报错:声明重复 |
interface Bear extends Animal { honey: boolean } |
type Bear = Animal & { honey: boolean } |
接口通过 extends 进行拓展 | 类别名通过相交进行‘拓展’ |
🔯 类型断言
有时某个值的类型信息是TS不知道的。比如你使用 document.getElementById,TS 仅仅知道返回 HTMLElement 类型,
如果在你的页面中通过ID可以获取一个 HTMLCanvasElement,在这种情况下,可以使用类型断言指定更具体的类型。
例如:
const myCanvas = document.getElementById("main_canvas") as HTMLCanvasElement;
🔯 字面量类型
在ts中声明一个变量,ts会根据初始值自动判断变量的类型,例如:
let changingString = 'Hello World'
changingString = 'Bowen' 😊
changingString = 124 🤢
直接声明一个字面量的类型是没有多大意义的,因为这样导致变量只能有唯一的值,例如:
let x: 'text' = 'text'
x = 'text' 😊
x = 'test' 🤢
但是将字面量与联合类型相结合,便可以表达出更有用的类型,比如一个方法仅仅接收一系列预设的值:
function printText(s: string, alignment: "letf" | "right" | "center") { ... }
printText("boy", "right") 😊
printText("boy", "top") 🤢
当然了这种结合可以多种类型互相配合的:
posted on 2022-01-05 11:28 Deflect-o-Bot 阅读(175) 评论(0) 编辑 收藏 举报