Typescript 快速入门
技.技术研究104 阅读约 12 分钟
Typescript
什么是 Typescript
Typescript 是 Javascript 的超集。
Typescript 为 Javascript 增加类型能力,避免 JS 弱类型下产生的各种有意无意的问题
为什么使用 Typescript
- 降低代码出错的风险
- 提高了代码的可读性
- 代码自动补全
缺点
增加学习成本
基础类型
let isDone: boolean = false
let age: number = 20
let binaryNumber: number = 0b1111
let firstName: string = 'viking'
let message: string = `Hello, ${firstName}, age is ${age}`
// undefined null 是任何类型的子类型
let u: undefined = undefined
let n: null = null
let num: number = undefined
any类型和联合类型
let notSure: any
notSure = 'maybe it is a string'
notSure = true
notSure.myName
notSure.getName()
let numberOrString: number | string = 234
numberOrstring = 'abc'
Array 和 Tuple(元祖)
let arrOfNumbers: number[] = [1, 2, 3, 4]
arrOfNumbers.push(5)
function test() {
console.log(arguments)
}
let user: [string, number] = ['viking', 1]
user = ['molly', 2, true]
Interface 接口
- 对对象的形状进行描述
- 对类进行抽象
interface Person {
readonly id: number;
name: string;
age?: number;
}
let viking: Person = {
id: 1234, // 只读,不可在修改
name: 'viking',
}
函数和类型推断
const add = function(x: number, y: number, z: number = 10, d?: number): number {
if (typeof z === 'number') {
return x + y + z
} else {
return x + y
}
}
const add2: (x: number, y: number, z: number, d?: number) => number = add
add2(2, 3, 5)
枚举(Enum)
enum Direction {
Up = 'UP',
Down = 'DOWN',
Left = 'Left',
Right = 'RIGHT',
}
const value = 'UP'
if (value === Direction.Up) {
console.log('go up!')
}
// 常量枚举
const enum Direction {
Up = 'UP',
Down = 'DOWN',
Left = 'Left',
Right = 'RIGHT',
}
泛型
function echo<T>(arg: T): T {
return arg
}
const result = echo('str')
function swap<T, U>(tuple: [T, U]): [U, T] {
return [tuple[1], tuple[0]]
}
const result2 = swap(['string', 123])
function echoWithArr<T>(arg: T[]): T[] {
console.log(arg.length)
return arg
}
const arrs = echoWithArr([1, 2, 3])
interface IWithLength {
length: number
}
function echoWithLength<T extends IWithLength>(arg: T): T {
console.log(arg.length)
return arg
}
const str = echoWithLength('str')
const obj = echoWithLength({ length: 10, width: 10 })
const arr2 = echoWithLength([1, 2, 3])
泛型(类和接口)
class Queue<T> {
private data = [];
push(item: T) {
return this.data.push(item)
}
pop(): T {
return this.data.shift()
}
}
const queue = new Queue<number>()
queue.push(1)
console.log(queue.pop().toFixed())
console.log(queue.pop().toFixed())
const queue2 = new Queue<string>()
queue2.push('str')
console.log(queue2.pop().length)
interface KeyPair<T, U> {
key: T;
value: U;
}
let kp1: KeyPair<number, string> = { key: 123, value: 'str' }
let kp2: keyPair<string, number> = { key: 'test', value: 123 }
let arr: number[] = [1, 2, 3]
let arrTwo: Array<number> = [1, 2, 3]
interface IPlus<T> {
(a: T, b: T) : T
}
function plus(a: number, b: number): number {
return a + b;
}
function connect(a: string, b: string): string {
return a + b
}
const a: IPlus<number> = plus
const b: IPlus<string> = connect
类型别名
type PlusType = (x: number, y: number) => number
function sum(x: number, y: number): number {
return x + y
}
const sum2: PlusType = sum
type NameResolver = () => string
type NameOrResolver = string | NameResolver
function getName(n: NameOrResolver): string {
if (typeof n === 'string') {
return n
} else {
return n()
}
}
类型断言
// 第一种
function getLength(input: string | number) : number {
const str = input as String
if (str.length) {
return str.length
} else {
const number = input as Number
return number.toString().length
}
}
// 第二种
function getLength(input: string | number) : number {
if((<string>input)) {
return (<string>input).length
} else {
return input.toString().length
}
}
声明文件
// axios.d.ts
// 它里面没有任何的实际代码,只有类型声明
// 只有类型 - 比如 interface, function 或者 class 等等
interface IAxios {
(url: string, method: string) : string;
get: (url: string) => string;
post: (url: string, data: any) => string;
}
declare const axios: IAxios
export default axios
内置类型
interface IPerson {
name: string
age: number
}
let viking: IPerson = { name: 'viking', age: 20 }
// Partial 把接口内所有参数变为可选
type IPartial = Partial<IPerson>
let viking2: IPartial = { name: 'viking' }
// Omit 忽略接口内某个参数
type IOmit = Omit<IPerson, 'name'>
let viking3: IOmit = { age: 20 }
配置文件(tsconfig.json)
{
"files": ["test.ts", "test.d.ts"],
"compilerOptions": {
"outDir": "./output",
"module": "ESNext",
"target": "ES5",
"declaration": true
}
}
相关文章
评论 (0)
还没有评论,来抢沙发
