typescript - 在 TypeScript 中扩展和接口并将其设置为等于某些东西(泛型)?
问题描述
我在库中遇到了一个类型声明,react-router
这让我很难理解:
export interface RouteComponentProps<
Params extends { [K in keyof Params]?: string } = {},
C extends StaticContext = StaticContext,
S = H.LocationState
> {
...
}
泛型的第一行对我来说是最难的。我希望得到一些帮助......
Params extends { [K in keyof Params]?: string } = {}
据我了解,我们将一些称为参数的接口Params
作为参数,然后将该接口中的每个元素设为可选。所以,我们正在操作传入的接口。
我也很难理解等号= {}
。扩展接口并将其设置为等于什么是什么意思?谢谢!
解决方案
参数泛型的解释
Params extends { [K in keyof Params]?: string } = {}
这意味着它Params
需要是一个对象(键->值映射),它的所有属性都是可选的,所有这些属性都是string
. {}
当我们不输入参数时,表示默认类型。我说属性可以是可选的,但不一定是可选的,extends
你可以读为is assignable to
,例如,具有所需所有/某些属性的对象将符合该要求。考虑:
// function which has Params property
const f = <Params extends { [K in keyof Params]?: string } = {}>(p: Params) => p;
type A = {
a: string // required field
}
f({ a: 'str' } as A) // is ok, pass the interface
type B = {
b?: string // not required field
}
f({} as B) // is ok pass the interface
所以真的Params
意味着任何具有字符串属性的对象,无论是否需要。这也意味着{}
可以使用空对象,因为我们不需要任何属性。
其他泛型的解释
下一行相当简单:
C extends StaticContext = StaticContext
TypeC
需要可分配给 type ,因此如果我们假设它是一个对象,则StaticContext
需要具有 的所有属性StaticContext
S = H.LocationState
类型S
可以是任何东西,但如果不提供,将作为默认值H.LocationState
推荐阅读
- java - 仅在 Safari 浏览器上下载 Java 中的视频文件抛出套接字写入错误
- json - 如何映射嵌套值以展平复杂的 json 数据结构 - Groovy
- python - Pyplot: Cmap(index) -> 颜色函数
- java - 如何处理错误
- django - django prefetch_related & Prefetch 嵌套
- sql-server - 如何更改 SSRS 中的部署凭据?
- java - 使用 http put 将值从 Angular 5 传递到 Java REST API,第 0:-1 行在输入处没有可行的替代方案
- wordpress - wordpress 简码包装
- java - Java JSONArray 对象返回 HTML 格式?
- ruby - Ruby 许多 HTTP 请求