一. 基础类型
Never:
- 抛出异常
- 无返回值的函数表达式
// 返回never的函数必须存在无法达到的终点
function error(message: string): never {
throw new Error(message);
}
// 推断的返回值类型为never
function fail() {
return error("Something failed");
}
// 返回never的函数必须存在无法达到的终点
function infiniteLoop(): never {
while (true) {
}
}
void:
通常用于表示函数无返回值
function warnUser(): void {
console.log("This is my warning message");
}
普通数组类型定义:
number[]
数组泛型:
Array
元祖类型(Tuple):
表示一个已知元素数量和类型的数组
// Declare a tuple type
let x: [string, number];
// Initialize it
x = ['hello', 10]; // OK
// Initialize it incorrectly
x = [10, 'hello']; // Error
枚举类型:
枚举类型提供的一个便利是你可以由枚举的值得到它的名字。 例如我们知道数值,但是不确定它映射到哪个名字,我们可以查找相应的名字
// 默认情况下,从0开始为元素编号; 也可以手动的指定成员的数值
enum Color {Red, Green, Blue}
let c: Color = Color.Green;
类型断言:没有运行时的影响,只是在编译阶段起作用
通过类型断言可以告诉编译器,我知道当前类型是什么(TypeScript会假设你已经进行了必须的检查)
两种表达形式:
“尖括号”语法
let someValue: any = "this is a string"; let strLength: number = (
someValue).length; as语法
let someValue: any = "this is a string"; let strLength: number = (someValue as string).length;
其他常见基础类型有:
object: 非原始类型
any: 任何类型
boolean: 布尔值
number: 数字类型
string: 字符串类型
Null 和 Undefined
二. 接口
接口是如何工作的:
类型检查器会查看接口的调用,编译器只会检查那些必需的属性是否存在,并且其类型是否匹配
只读属性:
只能在对象刚刚创建的时候修改其值
(初始化对象值后再进行赋值会报错error)
interface Point {
readonly x: number;
readonly y: number;
}
TypeScript具有ReadonlyArray
**只读属性也不可赋值给其他类型
let a: number[] = [1, 2, 3, 4];
let ro: ReadonlyArray = a;
a = ro; // error!
// 可用类型断言
a = ro as number[];
函数类型:
// 定义
interface SearchFunc {
(source: string, subString: string): boolean;
}
函数的参数会逐个进行检查,要求对应位置上的参数类型是兼容的
对于函数类型的类型检查来说,函数的参数名不需要与接口里定义的名字相匹配
// 使用
let mySearch: SearchFunc;
mySearch = function(src: string, sub: string): boolean {
let result = src.search(sub);
return result > -1;
}
索引类型:
暂无
三. 泛型
使用 类型变量T(泛型参数名可以使用任意名) 表示泛型
// T帮助我们捕获用户传入的类型以及返回类型
function identity(arg: T): T {
return arg;
}
可以用两种方法使用:
传入所有的参数,包含类型参数
// 明确的指定了T是string类型,并做为一个参数传给函数,使用了<> let output = identity
("myString"); // type of output will be 'string' 利用了类型推论 -- 即编译器会根据传入的参数自动地帮助我们确定T的类型
// 不使用尖括号(<>)来明确地传入类型, 编译器可以查看myString的值,然后把T设置为它的类型 let output = identity("myString"); // type of output will be 'string'
注:如果编译器没有自动地推断出类型,只能明确的传入T的类型
泛型变量:
在函数体必须正确的使用这个通用的类型变量
function loggingIdentity(arg: T): T {
console.log(arg.length); // Error: T doesn't have .length
return arg;
}
// 泛型约束
function loggingIdentity(arg: T[]): T[] { // T[] 可表示为 Array
console.log(arg.length); // Array has a .length, so no more error
return arg;
}
定义泛型接口:
interface GenericIdentityFn {
(arg: T): T;
}
function identity(arg: T): T {
return arg;
}
let myIdentity: GenericIdentityFn = identity;
// 明确泛型类型
let myIdentity: GenericIdentityFn = identity;
泛型类:
class GenericNumber {
zeroValue: T;
add: (x: T, y: T) => T;
}
let myGenericNumber = new GenericNumber();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y; };
泛型约束:
需要列出对于T的约束要求, 定义一个接口来描述约束条件
interface Lengthwise {
length: number;
}
function loggingIdentity(arg: T): T {
console.log(arg.length); // Now we know it has a .length property, so no more error
return arg;
}