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"> = {
...
}
但是由于函数可以进行自动推断,因此也许也可以将其用于对象。
答案 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
。