首页 > 解决方案 > 在 typescript 泛型中使用通配符

问题描述

这可能是一个简单的解决方案,但我还没有遇到过。给定一个 typescript 函数,比如func<T, D = any>(param1: T, param2: D) { ... }and 我用两个参数param1param2. 是否可以在不指定类型的D情况下指定类型,T以便打字稿仍然推断类型T但强制执行类型D

示例:假设我想强制使用外部接口定义的类型调用此函数:

export interface Data {
  field1: string;
  field2: boolean;
}

我现在可以使用func('Hello', {field1: 'World', field2: true})(这不能确保它param2是一个有效的Data对象)或者我可以使用func<string, Data>('Hello', {field1: 'World', field2: true}). 我不想做的是func<any, Data>('Hello', {field1: 'World', field2: true})。有解决方案吗?

标签: typescriptgenericstype-inference

解决方案


这称为部分参数推断,目前不支持。有一个建议添加这个,但据我所知,它并没有被积极地阅读。

您可以使用函数柯里化来实现这一点,尽管结果并不那么漂亮:

function func<T>(param1: T) {
  return function <D>(param2: D) {
    return [param1, param2]
  }
}  

export interface Data {
  field1: string;
  field2: boolean;
}
let a = func("Hi")<Data>({
  field1: "",
  field2: true
})


let b = func("Hi")<Data>({
  field1: 1, // err
  field2: true
})


推荐阅读