ts文档第一次阅读笔记
-
Boolean
-
Number
-
String
-
Array
两种声明方式:
let list:number[] = [1,2,3]
or 泛型(<>)
let list:Array<number> = [1,2,3]
-
Tuple(元组)
表示指定数量和类型的数组
-
Enum(枚举)
是一个被命名的常数集合
-
Any
支持任何类型的值,但是无法调用
any
类型的方法。 -
Void
表示没有任何类型,常用于函数没有返回值时
-
Null
-
Undefined
-
Never
表示的是那些永不存在的值的类型(总是会抛出异常或者根本就不会有返回值的函数)
-
Object
let obj:{a:string} = {a:''}
非原始类型
官方文档上只有Object
和Array
类型的变量在声明时类型用了首字大写,其余类型全部小写
用<类型>
的语法来表示类型,如
let array :Array<number> = [1,2,3]
已知某个变量的类型时,用来通过编译的方式
// 这里是any类型
let someValue: any = "string"
// 断言
let strLength: number = (<string>someValue).length
// as 语法
let strLength: number = (someValue as string).length
主要讲let/const
声明与var
声明的区别,通过let/const
声明的变量会存在块级作用域(词法作用域),不能在作用域以外访问。
解构,重命名属性名,缺省值(为undefined时的默认值)
可以用于函数声明时。
为类型命名,为代码定义契约。
interface LabelledValue {
label: string;
}
interface LabelledValue {
label?: string;
}
属性名前加上readonly
interface LabelledValue {
readonly label?: string;
}
传入的数据中有多余的属性会进行__额外的属性检查__,造成报错,可以用类型断言解决
interface SquareConfig {
color?: string;
width?: number;
}
function createSquare(config: SquareConfig): { color: string; area: number } {
// ...
}
// 类型断言
let mySquare = createSquare({ width: 100, opacity: 0.5 } as SquareConfig);
or 索引签名,可以带有任意数量的其他属性
[propName: string]: any
interface SquareConfig {
color?: string;
width?: number;
[propName: string]: any;
}
interface SearchFunc {
(source: string, subString: string): boolean; // (参数属性名及类型): 返回值类型
}
描述那些能够"通过索引得到"的类型,关于索引签名支持字符串和数值,使用数值的返回值必须和使用字符串一样。
字符串索引签名能够很好的描述dictionary
模式,确保所有属性与其返回值类型相匹配。
interface StringArray {
[index: number]: string;// 其他属性也必须可以通过number索引返回string的值
}
明确的强制一个类去符合某种契约(implements),描述的是类的公共部分(可以是方法,属性等)
interface ClockInterface {
currentTime: Date;
}
class Clock implements ClockInterface {
currentTime: Date;
constructor(h: number, m: number) { }
}
类静态部分与实例部分的区别,原文给出的示例是通过两个接口来分别限定类的静态部分(构造函数)和实例部分。此处不是很明白。原代码中并没有表现出接口对构造函数
的限制。
interface ClockConstructor {
new (hour: number, minute: number): ClockInterface;
}
interface ClockInterface {
tick();
}
function createClock(ctor: ClockConstructor, hour: number, minute: number): ClockInterface {
return new ctor(hour, minute);
}
class DigitalClock implements ClockInterface {
constructor(h: number, m: number) { }
tick() {
console.log("beep beep");
}
}
class AnalogClock implements ClockInterface {
constructor(h: number, m: number) { } // 没有构造函数也不会报错
tick() {
console.log("tick tock");
}
}
let digital = createClock(DigitalClock, 12, 17);
let analog = createClock(AnalogClock, 7, 32);
可以通过extends
相互继承,也可继承多个
interface Square extends Shape, PenStroke {
sideLength: number;
}
interface Counter {
(start: number): string;
interval: number;
reset(): void;
}
当接口继承了一个类类型时,它会继承类的成员但不包括其实现,接口类型只能被这个__类或其子类__所实现(implement)。个人理解就是只有通过继承这个这个类,并且implement接口才能符合规范。
类的类型、类的构造函数
在没有明确提供类型的地方,类型推论会帮助提供类型。
根据已有的值类型进行推论
反向的推论
ts的类型兼容性是基于结构子类型的,是基于类型的组成结构,与名义类型不同,不要求一定要显示声明对应的类型。