let isDone: boolean = false;
let decLiteral: number = 6;
let myName: string = 'tom';
1.示例
let myName: null = null;
let myName: undefined = undefined;
2.null/undefined是所有类型的子类型
let val: 其它类型 = undefined;
1.关键字为void,只能被赋值undefined和null
let unusable: void = undefined;
1.可以赋值为任意类型的值(没有类型限制)
let myFavoriteNumber: any = 'seven';
myFavoriteNumber = 7;
2.对任意值进行任何操作,返回值类型都是任意值
3.变量声明时,如果未指定类型
a.未赋值,则会默认为any类型
let something;
something = 'seven';
something = 7;
b.赋值了,则会被类型推断为所赋值的类型
let myFavoriteNumber = 'seven';
myFavoriteNumber = 7; // 会报错
1.表示取值可以为多种类型中的一种
2.示例
let myFavoriteNumber: string | number
myFavoriteNumber = 'seven'
myFavoriteNumber = 7
3.当不确定联合类型变量的类型时,只能访问此联合类型的所有类型里共有的属性或方法
function getString(something: string | number): string {
return something.toString()
}
1.对象的类型由接口定义
2.接口是对行为的抽象,而具体实现则由类去实现
3.示例代码
interface Person {
name: string
age: number
}
let tom: Person = {
name: 'Tom',
age: 25
}
4.对象定义时,变量的属性数量/形状必须和接口属性数量/形状保持一致
5.可选属性
interface Person {
name: string
age?: number
}
let tom: Person = {
name: 'Tom'
}
5.任意属性(一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的子类型)
interface Person {
name: string
age: number
[propName: string]: any
}
let tom: Person = {
name: 'Tom',
age: 25 // 会报错
}
6.只读属性
interface Person {
readonly id: number
age: number
}
let tom: Person = {
id: 10,
age: 25
}
tom.id = 89757 // 报错
1.类型+方括号表示法
let arr: number[] = [1, 1, 2, 3, 5];
let arr: number[] = [1, 1, 2, 3, '5']; // 会报错
arr.push('5'); // 会报错
2.数组泛型
let fibonacci: Array<number> = [1, 1, 2, 3, 5]
3.接口表示数组
interface NumberArray {
[index: number]: number
}
let fibonacci: NumberArray = [1, 1, 2, 3, 5]
4.any数组
let list: any[] = ['xjh', 25, { key: 'xx' }]
5.类数组
function sum() {
let args: IArguments = arguments
}
1.函数声明
function sum(x: number, y: number): number {
return x + y;
}
sum(1, 2, 3) // 报错
sum(1) // 报错
2.函数表达式
let mySum: (x: number, y: number) => number = function (x: number, y: number): number {
return x + y
}
3.用接口定义函数的形状
interface SearchFunc {
(source: string, subString: string): boolean
}
let mySearch: SearchFunc = function(source: string, subString: string) {
return source.search(subString) !== -1
}
4.可选参数
5.参数默认值
6.剩余参数
7.重载
function reverse(x: number): number
function reverse(x: string): string
function reverse(x: number | string): number | string {
if (typeof x === 'number') {
return Number(x.toString().split('').reverse().join(''))
} else if (typeof x === 'string') {
return x.split('').reverse().join('');
}
}
let myFavoriteNumber = 'seven';
myFavoriteNumber = 7; // 报错,因为已推断为字符串
let myFavoriteNumber;
myFavoriteNumber = 'seven';
myFavoriteNumber = 7;
1.手动指定一个值的类型
2.方法
3.断言成一个联合类型中不存在的类型是不允许的
function toBoolean(something: string | number): boolean {
return <boolean>something
}
type Name = string;
type NameResolver = () => string;
type NameOrResolver = Name | NameResolver;
type EventNames = 'click' | 'scroll' | 'mousemove';
function handleEvent(ele: Element, event: EventNames) {}
let tom: [string, number] = ['Tom', 25];
1.当赋值或访问一个已知索引的元素时,可以只赋值其中一项
let tom: [string, number];
tom[0] = 'Tom';
2.直接对元祖类型赋值时,需提供所有类型项
let tom: [string, number];
tom = ['Tom', 25];
3.当添加越界元素时,类型会被限制为定义项的类型
let tom: [string, number];
tom = ['Tom', 25];
tom.push('male');
tom.push(true); // 报错
enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
console.log(Days["Sun"] === 0); // true
console.log(Days[0] === "Sun"); // true
enum Days {Sun = 7, Mon = 1, Tue, Wed, Thu, Fri, Sat};
console.log(Days["Sun"] === 7); // true
console.log(Days["Mon"] === 1); // true
console.log(Days["Sat"] === 6); // true
1.常数项和计算所得项
2.计算所得项·示例
enum Color { Red, Green, Blue = "blue".length };
3.如果紧接在计算所得项后面的是未手动赋值的项,那么它就会因为无法获得初始值而报错
enum Color { Red = "red".length, Green, Blue }; // 报错
1.示例代码
const enum Directions {
Up,
Down,
Left,
Right
}
let directions = [ Directions.Up, Directions.Down, Directions.Left, Directions.Right ];
var directions = [0, 1, 2, 3]; //编译结果
2.常数枚举与普通枚举的区别是,它会在编译阶段被删除,并且不能包含计算成员
1.示例代码
declare enum Directions {
Up,
Down,
Left,
Right
}
let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right];
var directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]; //编译结果
2.declare 定义的类型只会用于编译时的检查,编译结果中会被删除
3.外部枚举与声明语句一样,常出现在声明文件中
public 可被公开访问
private 仅供自身访问,子类也不可以访问它的属性/方法
protected 受保护的访问,子类可以访问它的属性/方法
用abstract关键字定义(抽象类/抽象方法)
不允许被实例化
抽象方法必须被子类实现
把各层级的类之间共有的特性提取出来进行实现的部分叫接口
接口通过interface定义,通过implements实现
一个类只能继承一个类,但是可以实现多个接口
在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性
function createArray<T>(length: number, value: T): Array<T> {
let result: T[] = [];
for (let i = 0; i < length; i++) {
result[i] = value;
}
return result;
}
createArray<string>(3, 'x'); // ['x', 'x', 'x']
function swap<T, U>(tuple: [T, U]): [U, T] {
return [tuple[1], tuple[0]];
}
swap([7, 'seven']); // ['seven', 7]
1.由于事先不知道它是哪种类型,所以不能随意的操作它的属性或方法(会报错)
function loggingIdentity<T>(arg: T): T {
console.log(arg.length);
return arg;
}
2.对泛型进行约束
interface Lengthwise {
length: number;
}
function loggingIdentity<T extends Lengthwise>(arg: T): T {
console.log(arg.length);
return arg;
}
3.泛型之间也可以相互约束
写法一
interface CreateArrayFunc {
<T>(length: number, value: T): Array<T>;
}
写法二
interface CreateArrayFunc<T> {
(length: number, value: T): Array<T>;
}
class GenericNumber<T> {
zeroValue: T;
add: (x: T, y: T) => T;
}
1.当使用泛型时没有在代码中直接指定类型参数,从实际值参数中也无法推测出时,这个默认类型就会起作用
2.示例代码
function createArray<T = string>(length: number, value: T): Array<T> {
let result: T[] = [];
for (let i = 0; i < length; i++) {
result[i] = value
}
return result;
}
1.使用第三方库时,需要引用它的声明文件,才能获得对应的代码补全、接口提示等功能
2.声明语句中只能定义类型,切勿在声明语句中定义具体的实现
3.示例代码
declare var jQuery: (selector: string) => any
4.注意
5.第三方声明文件
npm install @types/jquery --save-dev
1.如果定义了两个相同名字的函数、接口或类,那么它们会合并成一个类型
2.合并的属性类型必须是唯一的
3.函数合并
4.接口合并
interface Alarm {
price: number;
}
interface Alarm {
weight: number;
}
// 等同于
interface Alarm {
price: number;
weight: number;
}
5.类合并
1.声明合并
declare function jQuery(selector: string): any
declare namespace jQuery {
function ajax(url: string, settings?: any): void
}
2.export
3.export default
4.commonjs规范下的export
module.exports = foo; // 整体导出
exports.bar = bar; // 单个导出
import foo = require('foo'); // 整体导入
import bar = foo.bar; // 单个导入
export = foo
declare function foo(): string
5.UMD库的导出
export as namespace '导出名'
6.在npm包/UMD库中扩展全局变量
declare global {
interface String {
prependHello(): string
}
}
7.模块插件(declare module)
// index.d.ts声明
import * as moment from 'moment';
declare module 'moment' {
export function foo(): moment.CalendarKey
}
// index.ts使用
import * as moment from 'moment';
import 'moment-plugin';
moment.foo();
8.声明文件中的依赖
/// <reference types="jquery" />
declare function foo(options: JQuery.AjaxSettings): string
/// <reference types="sizzle" />
/// <reference path="JQueryStatic.d.ts" />
/// <reference path="JQuery.d.ts" />
/// <reference path="misc.d.ts" />
/// <reference path="legacy.d.ts" />
export = jQuery;
9.自动生成声明文件
{
"compilerOptions": {
"module": "commonjs",
"outDir": "lib",
"declaration": true
}
}
1.将声明文件和源码放在一起(ts声明查找也遵循a=>b=>c)
2.将声明文件发布到@types下
原文:https://www.cnblogs.com/kanyu/p/11777191.html