Skip to content

TypeScript

面试题

  1. 什么是泛型?

泛型就是在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。

  1. 泛型的优点是什么?
  • 代码复用
  • 类型检查
  1. 泛型的使用场景有哪些?
  • 函数
  • 接口
  1. 泛型的使用方式有哪些?
  • 泛型函数
  • 泛型接口
  • 泛型类
  1. 泛型函数
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'])
  1. 泛型接口
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)
  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')
  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 })
  1. 泛型的好处
  • 函数和类可以轻松地支持多种类型,增强程序的扩展性
  • 不必写多条函数重载,冗长的联合类型声明,增强代码可读性
  • 灵活控制类型之间的约束
  1. 泛型的缺点
  • 不能约束类的静态成员
  • 不能约束构造函数
  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
  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 })