typescript 基础类型
// Declare a tuple type
let x: [string, number];
// Initialize it
x = ['hello', 10]; // OK
// Initialize it incorrectly
x = [10, 'hello']; // Error
延伸联合类型
//定义一个联合类型,当你的数组中只有 number 和 string 类型的时候
let a =(number | string)[]
enum Color {Red, Green, Blue}
let c: Color = Color.Green;
enum Color {Red = 1, Green, Blue}
let c: Color = Color.Green;
// ts
enum types { //ok
primary, info, danger // 0, 1, 2
}
//ts 编译后 的js
var types;
(function (types) {
types[types["primary"] = 0] = "primary";
types[types["info"] = 1] = "info";
types[types["danger"] = 2] = "danger"; // 0, 1, 2
})(types || (types = {}));
复制代码
可以看到我们可以通过0,1,2去访问 string 的值,也可以反向的访问,这里做了双向的访问的值。
let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false; // okay, definitely a boolean
let notSure: any = 4;
notSure.ifItExists(); // okay, ifItExists might exist at runtime
notSure.toFixed(); // okay, toFixed exists (but the compiler doesn't check)
let prettySure: Object = 4;
prettySure.toFixed(); // Error: Property 'toFixed' doesn't exist on type 'Object'.
function warnUser(): void {
console.log("This is my warning message");
}
//声明一个void类型的变量没有什么大用,因为你只能为它赋予undefined和null:
let unusable: void = undefined
复制代码
// Not much else we can assign to these variables!
let u: undefined = undefined;
let n: null = null;
// 返回never的函数必须存在无法达到的终点
function error(message: string): never {
throw new Error(message);
}
// 推断的返回值类型为never
function fail() {
return error("Something failed");
}
// 返回never的函数必须存在无法达到的终点
function infiniteLoop(): never {
while (true) {
}
}
复制代码
// 模拟服务,提供不同的数据。这里模拟了一个字符串和一个数值
var service = {
getStringValue: function() {
return "a string value";
},
getNumberValue: function() {
return 20;
}
};
// 处理数据的中间件。这里用 log 来模拟处理,直接返回数据当作处理后的数据
function middleware(value) {
console.log(value);
return value;
}
// JS 中对于类型并不关心,所以这里没什么问题
var sValue = middleware(service.getStringValue());
var nValue = middleware(service.getNumberValue());
复制代码
const service = {
getStringValue(): string {
return "a string value";
},
getNumberValue(): number {
return 20;
}
};
const sValue: string = middleware(service.getStringValue());
const nValue: number = middleware(service.getNumberValue());
换成
typescript
的时候我们的中间件middleware
,需要返回正确的string
和number
类型。我们需要怎么做啦?
function middleware(value: any): any{
console.log(value);
return value;
}
复制代码
这个方法可以让最后的类型检测通过,但是使用
any
的话,致使middleware
就没有什么用了。
middleware
function middleware1(value: string): string { ... }
function middleware2(value: number): number { ... }
复制代码
function middleware(value: string): string;
function middleware(value: number): number;
function middleware(value: any): any {
// 实现一样没有严格的类型检查
}
复制代码
但是类型过多的话这种方法也不好使。
function middleware<T>(value: T): T {
console.log(value);
return value;
}
复制代码
middleware
后面紧接的 表示声明一个表示类型的变量,Value: T
表示声明参数是T
类型的,后面的: T
表示返回值也是T
类型的。那么在调用middlewre(getStringValue())
的时候,由于参数推导出来是string
类型,所以这个时候 T 代表了string
,因此此时middleware
的返回类型也就是string
;而对于middleware(getNumberValue())
调用来说,这里的T
表示了number
。
vscode
的话,我们默认你已经安装的支持 typescript 的环境。可以看到我们在推导类型和返回值类型的时候,vscode
会提示你对应的 string
和 number
的类型。function on(event: string, (payload: string | number)=> unkown){}
// 类型重载
function on(event: 'message', (payload: string)){}
functon on(evnet: 'close', (payload: number)){}
const setType =new Set {
message: string;
close: number;
}
// 泛型类
function on(event: T, (payload: setType[T])){}