Typescript函数泛型可以自动推断类型,对象泛型类型是否等效?

时间:2020-07-16 09:59:49

标签: typescript typescript-typings existential-type

function <Obj extends object>funName(o:Obj): Obj{
  ...
}

上述泛型函数在参数和返回类型之间建立了一定的关系,而没有强迫用户实际传递类型。

是否存在等价的对象通用类型(POJO-普通的旧JS对象),而没有强制用户传递类型?

type Props = <S extends string>{
  selectedTab: S 
  tabs: Record<S, any>
}

const props1: Props = { //ok 
  selectedTab: "about"
  tabs: {
    about: {...} 
  }
}

const props2: Props = { //Error
  selectedTab: "contact us"
  tabs: {
    about: {...} 
  }
}

我知道可以通过传递类型来实现。

const props1: Props<"about"> = { 
  ...
}

但是由于函数可以进行自动推断,因此也许也可以将其用于对象。

1 个答案:

答案 0 :(得分:0)

类型泛型没有自动推断。使用类型时,忽略泛型的唯一方法是提供以下默认值:

Props<S = string> {
   selectedTab: S;
   tabs: Record<S, any>;
}

但是,这并不能像您在问题中建议的那样获得推论。如果没有提供其他值,这只会将通用设置为默认值。使用上述类型定义,以下内容仍然有效,因为S默认为string

let p: Props = {
   selectedTab: 'contact us'
   tabs: {
      about: {}
   }
}

原因是在函数调用中,您会根据参数的类型自动指定泛型的类型。在您的示例中,函数调用将返回您传递给它的任何类型。

即使有这样的功能,标记为//Error的示例仍然有效,因为S可以推断为string'contact us' | 'about'会匹配泛型的约束S extends string