- 强类型与弱类型
- a. 强类型不允许随意的隐式类型转换,弱类型是允许的
- 静态类型与动态类型
- a. 静态类型:声明时它的类型就是明确的
- b. 动态类型:变量是没有类型的,运行的时候确定
- Flow
const a: string = 'foobar'
const b: number = Infinity
const c: boolean = false
const d: null = null
const e: void = undefined
const f: symbol = Symbol()
const arr1: Array<number> = [1, 2, 3]
const arr2: number[] = [1, 2, 3]
const foo: [string, number] = ['foo', 100]
const obj1: { foo: string, bar: number } = { foo: 'string', bar: 100 }
const obj2: { foo?: string, bar: number } = { bar: 100 }
const obj3: { [string]: string } = {}
obj3.key1 = 'value1'
obj3.key2 = 'value2'
function foo (callback: (string, number) => void) {
callback('string', 100)
}
foo(function (str, n) {
})
const a: 'foo' = 'foo'
const type: 'success' | 'warning' | 'danger' = 'success'
type StringOrNumber = string | number
const b: StringOrNumber = 'string'
const gender: ?number = undefined
function square (n: number) {
return n * n
}
let num: number = 100
function foo (): number {
return 100
}
function bar (): void {
}
- b. 本身不是JavaScript语法,所以编译的时候不支持
- c. 通过flow-remove-types可以移除
- d. 或者通过babel移除
- e. 可以给原始数据类型和数组、对象、函数类型、特殊类型添加类型注解
- TypeScript
const a: string = 'foobar'
const b: number = 100
const c: boolean = true
const e: void = undefined
const f: null = null
const g: undefined = undefined
const h: symbol = Symbol()
const a = 123
export {}
- c. :object指代的不只是对象类型,如果需要指代对象类型,需要用{}字面量
export {}
const foo: object = function () {}
const obj: { foo: number, bar: string } = { foo: 123, bar: 'string' }
- d. 数组:Array<>尖括号中指的是数组中存的内容类型,同样用number[]也可以代表数字数组
export {}
const arr1: Array<number> = [1, 2, 3]
const arr2: number[] = [1, 2, 3]
function sum (...args: number[]) {
return args.reduce((prev, current) => prev + current, 0)
}
sum(1, 2, 3)
export {}
const tuple: [number, string] = [18, 'zce']
const [age, name] = tuple
const entries: [string, number][] = Object.entries({
foo: 123,
bar: 456
})
const [key, value] = entries[0]
- f. 枚举:使用对象模拟这种数据类型,ts中可以通过enum关键字定义,最终会编译成双向的键值对对象
export {}
const enum PostStatus {
Draft,
Unpublished,
Published
}
const post = {
title: 'Hello TypeScript',
content: 'TypeScript is a typed superset of JavaScript.',
status: PostStatus.Draft
}
- g. 函数类型:
-
- ⅰ. 函数声明:参数类型设置在参数后面,返回值类型设置在参数括号的后面。如果参数后面加一个问好,那就编程可选参数了。如果需要传入任意个数的参数,需要用到...rest: 后面加具体类型
-
export {}
function func1 (a: number, b: number = 10, ...rest: number[]): string {
return 'func1'
}
func1(100, 200)
func1(100)
func1(100, 200, 300)
const func2: (a: number, b: number) => string = function (a: number, b: number): string {
return 'func2'
}
- h. 任意类型::any是可以接收任意类型的参数。是不安全的,不建议使用
export {}
function stringify (value: any) {
return JSON.stringify(value)
}
stringify('string')
stringify(100)
stringify(true)
let foo: any = 'string'
foo = 100
foo.bar()
- i. 隐式类型推断:let age = 18ts就会推断age是number数据类型,如果传入的是string就会报错。建议为每个变量添加明确的类型
export {}
let age = 18
let foo
foo = 100
foo = 'string'
export {}
const nums = [110, 120, 119, 112]
const res = nums.find(i => i > 0)
const num1 = res as number
const num2 = <number>res
- k. 接口:一种规范或者一种契约。使用interface关键词,后面接上接口名称{}。约束对象的结构。接口中可以添加可选成员,在成员名称后面添加一个?。接口中也可以添加只读成员,通过前面添加readonly关键词修饰。动态成员:成员使用
[pop: string]这种方式创建。
export {}
interface Post {
title: string
content: string
}
function printPost (post: Post) {
console.log(post.title)
console.log(post.content)
}
printPost({
title: 'Hello TypeScript',
content: 'A javascript superset'
})
export {}
class Person {
name: string
age: number
constructor (name: string, age: number) {
this.name = name
this.age = age
}
sayHi (msg: string): void {
console.log(`I am ${this.name}, ${msg}`)
}
}
-
- ⅱ. 类成员的访问修饰符:在类前面添加,类似private,public:默认是public,protected受保护的:只允许在子类访问的成员。可以控制类成员的访问级别。
-
-
- ⅳ. 类与接口:首先在接口中抽象对应的方法,然后在类中具体去实现对应的方法。建议一个接口抽象单独的一个方法。
-
- ⅴ. 抽象类:在类的前面添加abstract,就会将此类定义为抽象类。定义为抽象类之后只能继承,不能通过new关键字创建了。
- m. 泛型:在声明的时候不去定义类型,在调用的时候传递一个类型。createArray
export {}
function createNumberArray (length: number, value: number): number[] {
const arr = Array<number>(length).fill(value)
return arr
}
function createStringArray (length: number, value: string): string[] {
const arr = Array<string>(length).fill(value)
return arr
}
function createArray<T> (length: number, value: T): T[] {
const arr = Array<T>(length).fill(value)
return arr
}
const res = createArray<string>(3, 'foo')
- n. 类型声明:通过declare方式声明function。在安装第三方库的时候,有可能没有类型声明,如果没有的话需要单独安装一个类型声明模块。
import { camelCase } from 'lodash'
import qs from 'query-string'
qs.parse('?key=value&key2=value2')
const res = camelCase('hello typed')