TypeScript
面试题
- 什么是泛型?
泛型就是在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。
- 泛型的优点是什么?
- 代码复用
- 类型检查
- 泛型的使用场景有哪些?
- 函数
- 接口
- 类
- 泛型的使用方式有哪些?
- 泛型函数
- 泛型接口
- 泛型类
- 泛型函数
typescript
function log<T>(value: T): T {
console.log(value)
return value
}
log<string[]>(['a', 'b'])
function log<T>(value: T): T {
console.log(value)
return value
}
log<string[]>(['a', 'b'])
- 泛型接口
typescript
interface Log<T> {
(value: T): T
}
let myLog: Log<number> = log
myLog(1)
interface Log<T> {
(value: T): T
}
let myLog: Log<number> = log
myLog(1)
- 泛型类
typescript
class Log<T> {
run(value: T) {
console.log(value)
return value
}
}
let log1 = new Log<number>()
log1.run(1)
let log2 = new Log()
log2.run('1')
class Log<T> {
run(value: T) {
console.log(value)
return value
}
}
let log1 = new Log<number>()
log1.run(1)
let log2 = new Log()
log2.run('1')
- 泛型约束
typescript
interface Length {
length: number
}
function log<T extends Length>(value: T): T {
console.log(value, value.length)
return value
}
log([1])
log('123')
log({ length: 1 })
interface Length {
length: number
}
function log<T extends Length>(value: T): T {
console.log(value, value.length)
return value
}
log([1])
log('123')
log({ length: 1 })
- 泛型的好处
- 函数和类可以轻松地支持多种类型,增强程序的扩展性
- 不必写多条函数重载,冗长的联合类型声明,增强代码可读性
- 灵活控制类型之间的约束
- 泛型的缺点
- 不能约束类的静态成员
- 不能约束构造函数
- 泛型的兼容性
- 泛型接口
typescript
interface Empty<T> {
}
let obj1: Empty<number> = {}
let obj2: Empty<string> = {}
obj1 = obj2
interface Empty<T> {
}
let obj1: Empty<number> = {}
let obj2: Empty<string> = {}
obj1 = obj2
- 泛型函数
typescript
let log1 = <T>(x: T): T => {
}
let log2 = <U>(y: U): U => {
}
log1 = log2
let log1 = <T>(x: T): T => {
}
let log2 = <U>(y: U): U => {
}
log1 = log2
- 泛型类
typescript
class Log<T> {
}
let log1 = new Log<number>()
let log2 = new Log<string>()
log1 = log2
class Log<T> {
}
let log1 = new Log<number>()
let log2 = new Log<string>()
log1 = log2
- 泛型的约束
typescript
interface Length {
length: number
}
function log<T extends Length>(value: T): T {
console.log(value, value.length)
return value
}
log([1])
log('123')
log({ length: 1 })
interface Length {
length: number
}
function log<T extends Length>(value: T): T {
console.log(value, value.length)
return value
}
log([1])
log('123')
log({ length: 1 })