type、interface、泛型怎么用

先理解原理和示例,再练习完整口述与追问。

能给对象、函数、组件参数和接口响应定义类型。type 可表达联合等类型,interface 可声明合并;二者不是绝对优劣。泛型用于保留输入与输出类型的关系,别只把 any 换成 T。

interface 擅长描述可扩展对象契约并支持适用的声明合并;type 可以表达联合、交叉、映射和条件等更广的类型组合。泛型用类型参数表达输入输出之间的关系,而不是把一个类型换成 any。选择时优先让调用点保留正确推断,约束确实必须的能力。

ts
function pick<T, K extends keyof T>(object: T, key: K): T[K] {
  return object[key]
}
const name = pick({ name: 'Lin', age: 20 }, 'name')
// name 推断为 string,传不存在的键会报错

相比返回 any,T[K] 保留了具体字段类型。

交叉类型遇到互不相容字段可能产生 never,不是任意拼接都合理。泛型被擦除,不会在运行时产生类型分支或验证器。

interface 常用于声明可扩展的对象契约,并支持声明合并;type 可以方便表达联合、交叉、映射等组合,两者很多对象场景都能胜任。泛型让调用之间的类型关系被保留下来,例如 getById<T> 返回与请求契约关联的结果,而不是统一丢成 any。类型设计要反映真实数据,不是为了炫技写复杂类型体操;运行时接口仍可能与声明不符。