首页 > 解决方案 > 在 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作为参数,然后将该接口中的每个元素设为可选。所以,我们正在操作传入的接口。

我也很难理解等号= {}。扩展接口并将其设置为等于什么是什么意思?谢谢!

标签: typescript

解决方案


参数泛型的解释

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


推荐阅读