【问题标题】:In Typescript, what is type PoorMansUnknown = {} | null | undefined and how would you deal with it?在 Typescript 中,什么是类型 PoorMansUnknown = {} |空 |未定义,您将如何处理?
【发布时间】:2020-07-01 06:41:31
【问题描述】:

谁能帮我理解以下类型声明的含义...

type PoorMansUnknown = {} | null | undefined;

这是一个 TypeScript 声明,我在 history 包的上下文中遇到过它。

我已经四处寻找并尝试自己理解它,但鉴于我对 TypeScript 还很陌生,这让我有点难过。我在上面找到了以下信息:

我的假设是在这一点上,这个声明的作者打算用它来表达......在运行时,这个东西可能是一个空对象或 null 或未定义。

有关更多上下文,这种类型出现在我的雷达上的方式是在包 react-router-dom (typedef here) 中。具体来说,我使用了组件Redirect 和它的属性to: object,因为我希望能够告诉组件我已经路由到了我之前所在的位置

例如

<Redirect to={{
  pathname: "/login",
  state: { from: "current-path }
 }} />

react router 的文档说...

可以通过重定向到组件中的 this.props.location.state 访问状态对象。然后将通过路径名“/login”指向的登录组件中的 this.props.location.state.referrer 访问这个新的引荐来源网址键(不是特殊名称)

所以,我去访问 props.location.state 这样...

const { from }  = location.state || { from: { path: '/' } }

我得到一个错误

Property 'from' does not exist on type '{} | { from: { path: string; }; }'.

我通过 typedef 链跟踪这一点,从 LocationState 开始,一直到 PoorMansUnknown 的声明

这就是我开始困惑的地方。这种类型是什么?我该如何处理?

我发现了一些与它相关的东西here,它说将它转换为any。所以我这样做了:

const { from }  = location.state as any || { from: { path: '/' } }

但我不确定。它确实有效,但这只是一种解决方法吗?


长话短说,你以前遇到过这样的事情吗?

type PoorMansUnknown = {} | null | undefined;

如果是这样,您认为这意味着什么?您将如何处理使用它的组件?

【问题讨论】:

  • 可能是一个愚蠢的问题,但为什么你需要知道你来自哪里?我通常避免将有关应用程序行为的内容置于历史状态,因为这可能会被覆盖并可能给代码行为添加错误/可变性
  • 你问什么是 Typescript union type typescriptlang.org/docs/handbook/…
  • @JohnRuddell,感谢您的回复。其想法是在用户成功登录后能够将用户返回到最初请求的受保护路线。即,如果未登录并导航到受保护路线,则将他们路由到登录页面,如果他们成功登录,将他们重定向回他们最初要求的位置。想想你的回复,也许没必要。
  • @Crocsx,也感谢您的澄清。我希望了解PoorMansUnknown 的创建者的意图。当您跟踪它时,为什么 LocationState 最终会出现在PoorMansUnknown,我有点困惑。这让我有点难过。
  • 你应该在这里使用标准的重定向格式。又名www.my.domain.here/login?r=&lt;redirect url here&gt;。您可以使用redirectr 作为参数,只要对您更有意义。最好使用带有重定向 url 的查询字符串参数,而不是在历史状态中。因为可以从另一个包、第 3 方库、chrome 扩展...等清除或重置状态。它会破坏您的应用程序。相反,您应该只依赖给定的 url。如果您需要帮助修复类型,我们需要查看更多关于用法的代码,如何在您的组件上设置类型......等等。

标签: reactjs typescript react-router-dom history


【解决方案1】:

PoorMansUnknown 应该等同于 unknown 类型。当unknown 不可用时,我们使用PoorMansUnknown,即因为我们必须支持不支持unknown 类型的旧版TypeScript。

“未知”是历史状态的默认类型。您可以自定义它:

type Props = RouteComponentProps<{}, StaticContext, { from: { pathname: string; }; }>;

const MyComponent: FC<Props> = ({ location }) => {
  const { from }  = location.state || { from: { pathname: '/' } }
  // …
}

https://github.com/DefinitelyTyped/DefinitelyTyped/blob/ee646ad6a1cd47f71f099c0a03686d8f3547f3b0/types/react-router/test/examples-from-react-router-website/Auth.tsx#L72-L102

【讨论】:

  • 感谢 Oliver,这绝对有助于为我解释。非常感激。那应该是this unknown type,对吗?
  • 是的,就是这个
  • 如何修改它以使其适用于 useLocation 挂钩? @OliverJosephAsh
  • @peja 只需将任何类型定义传递给 useLocation。示例:useLocation&lt;{ from: { pathname: string } }&gt;().
猜你喜欢
  • 2013-04-10
  • 1970-01-01
  • 2016-11-14
  • 2021-01-08
  • 2018-02-02
  • 2017-02-16
  • 2018-05-16
  • 2020-01-23
  • 2018-02-23
相关资源
最近更新 更多