typescript备忘录

一.基础类型:
布尔值
let isDone: boolean = true;

数字
let num:number = 6;

字符串
let name:string = “123456”;

数组
let list:number[] = [1,2,3];
let list:Array<number> = [1,2,3];//数组泛型

元祖
let list: [string,number] = ['123',1]//元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同

枚举
enum Color {Red, Green, Blue}
let c: Color = Color.Green;
元素编号默认从0开始,但是可以直接赋值
enum Color {Red = 1, Green = 2, Blue = 4}//编号为1,2,4
可以直接Color[4]调用,值为Blue

any
let notSure: any = 4;

void
function warnUser(): void {
console.log("This is my warning message");
}
void类型像是与any类型相反,它表示没有任何类型。 当一个函数没有返回值时,你通常会见到其返回值类型是 void

null,undefined
默认情况下null和undefined是所有类型的子类型

never
never类型表示的是那些永不存在的值的类型
never类型是那些总是会抛出异常或根本就不会有返回值的函数表达式或箭头函数表达式的返回值类型

object
object表示非原始类型,也就是除number,string,boolean,symbol,null或undefined之外的类型

类型断言
let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;

二.接口interface(接口的作用就是为类型命名和为你的代码或第三方代码定义契约)
1.带有可选属性的接口与普通的接口定义差不多,只是在可选属性名字定义的后面加一个?符号。
interface SquareConfig {
color?: string;
width?: number;
}

2.interface Point {
readonly x: number;
readonly y: number;
}
readonly可以指定只读属性
同理数组中也可以ReadonlyArray<T>类型,它与Array<T>相似,只是把所有可变方法去掉了,因此可以确保数组创建后再也不能被修改。

3.字符串索引签名(绕开检查的一种方式,还可用类型断言XXX as XXX)
interface SquareConfig {
color?: string;
width?: number;
[propName: string]: any;
}
我们要表示的是SquareConfig可以有任意数量的属性,并且只要它们不是color和width,那么就无所谓它们的类型是什么。

4.函数类型
定义函数参数类型及返回值类型
interface SearchFunc {
(source: string, subString: string): boolean;
}
let mySearch: SearchFunc;
mySearch = function(source: string, subString: string) {
let result = source.search(subString);
return result > -1;
}

5.接口继承类
当接口继承了一个类类型时,它会继承类的成员但不包括其实现。

6.当一个接口继承了类的私有成员变量,则只有这个类的子类能够实现此接口。私有字段用#属性名表示。

7.派生类包含了一个构造函数,它 必须调用 super(),它会执行基类的构造函数。
而且,在构造函数里访问 this的属性之前,我们 一定要调用 super()

8. 在TypeScript里,成员都默认为 public

9.当成员被标记成 private时,它就不能在声明它的类的外部访问

10.protected修饰符与 private修饰符的行为很相似,但有一点不同, protected成员在派生类中仍然可以访问。

11.构造函数也可以被标记成 protected。 这意味着这个类不能在包含它的类外被实例化,但是能被继承。
也就是说不能直接调用此类的构造函数。

12.静态属性必须通过类名.xx访问。

13.抽象类做为其它派生类的基类使用。 它们一般不会直接被实例化。抽象类中的抽象方法不包含具体实现并且必须在派生类中实现。
不能直接调用派生类中抽象类所不具有的方法。

14.可选参数必须跟在必须参数后面。

15.剩余参数
在JavaScript里,你可以使用 arguments来访问所有传入的参数。在TypeScript里,你可以把所有参数收集到一个变量里
function buildName(firstName: string, ...restOfName: string[]) {
return firstName + " " + restOfName.join(" ");
}

16. 顶级的非方法式调用会将 this视为window。 (注意:在严格模式下, this为undefined而不是window)

17.泛型
我们需要一种方法使返回值的类型与传入参数的类型是相同的
function identity<T>(arg: T): T {
return arg;
}
我们给identity添加了类型变量T。 T帮助我们捕获用户传入的类型(比如:number),之后我们就可以使用这个类型。
之后我们再次使用了 T当做返回值类型。现在我们可以知道参数类型与返回值类型是相同的了。

现在假设我们想操作T类型的数组而不直接是T
function loggingIdentity<T>(arg: T[]): T[] {
console.log(arg.length);
return arg;
}

18.你可以使用 readonly关键字将属性设置为只读的

19.交叉类型<T&U>

20.联合类型我们用竖线( |)分隔每个类型,所以 number | string | boolean表示一个值可以是 number, string,或 boolean
如果一个值是联合类型,我们只能访问此联合类型的所有类型里共有的成员。

21.类型谓词:谓词为 parameterName is Type这种形式, parameterName必须是来自于当前函数签名里的一个参数名

22.string | null, string | undefined和 string | undefined | null是不同的类型,也就是说不能直接赋值

23.可选参数会被自动地加上 | undefined
function f(x: number, y?: number) {
return x + (y || 0);
}
f(1, 2);
f(1);
f(1, undefined);
f(1, null); // error, 'null' is not assignable to 'number | undefined'

24.如果编译器不能够去除 null或 undefined,你可以使用类型断言手动去除。 语法是添加 ! 后缀

25.类型别名type Name = string
然而,类型别名不能出现在声明右侧的任何地方。

type Yikes = Array<Yikes>; // error

26.首先是 keyof T, 索引类型查询操作符。 对于任何类型 T, keyof T的结果为 T上已知的公共属性名的联合

27.第二个操作符是 T[K], 索引访问操作符 这意味着 person['name']具有类型 Person['name'] — 在我们的例子里则为 string类型
意思是在Person接口中,name的类型为string

28.type Nullable<T> = { [P in keyof T]: T[P] | null }
属性列表是 keyof T且结果类型是 T[P]或者null的变体。 这是使用通用映射类型的一个好模版

29.预定义的有条件类型:
Exclude<T, U> -- 从T中剔除可以赋值给U的类型。
Extract<T, U> -- 提取T中可以赋值给U的类型。
NonNullable<T> -- 从T中剔除null和undefined。
ReturnType<T> -- 获取函数返回值类型。
InstanceType<T> -- 获取构造函数类型的实例类型。
type T00 = Exclude<"a" | "b" | "c" | "d", "a" | "c" | "f">; // "b" | "d"

30.外部枚举declare在正常的枚举里,没有初始化方法的成员被当成常数成员。
对于非常数的外部枚举而言,没有初始化方法时被当做需要经过计算的

31.编译模块的ts文件时:我们必需要在命令行上指定一个模块目标。
对于Node.js来说,使用--module commonjs; 对于Require.js来说,使用--module amd
tsc --module commonjs Test.ts

32.危险信号(错误写法)
文件的顶层声明是export namespace Foo { ... } (删除Foo并把所有内容向上层移动一层)
文件只有一个export class或export function (考虑使用export default)
多个文件的顶层具有同样的export namespace Foo { (不要以为这些会合并到一个Foo中!)

33.命名空间namespace Test{}
记录它们类型的同时还不用担心与其它对象产生命名冲突。
因此,我们把验证器包裹到一个命名空间内,而不是把它们放在全局命名空间下

34.当涉及到多文件时,我们必须确保所有编译后的代码都被加载了。 我们有两种方式
tsc --outFile sample.js Test.ts
tsc --outFile sample.js Validation.ts LettersOnlyValidator.ts ZipCodeValidator.ts Test.ts
第二种方式,我们可以编译每一个文件(默认方式),那么每个源文件都会对应生成一个JavaScript文件。
然后,在页面上通过 <script>标签把所有生成的JavaScript文件按正确的顺序引进来

posted @ 2019-10-22 18:02  你风致  阅读(200)  评论(0编辑  收藏  举报