在 Typescript 中,PoorMansUnknown = {} | 类型是什么?空| 未定义,您将如何处理?

Dan*_*noz 8 history typescript reactjs react-router-dom

有人可以帮我理解以下类型声明的含义...

type PoorMansUnknown = {} | null | undefined;
Run Code Online (Sandbox Code Playgroud)

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

我已经四处搜索试图自己理解它,但是,鉴于我对 TypeScript 还很陌生,这让我有点困惑。我发现了以下信息:

我的假设是在这一点上,这个声明的作者希望它是一种说法……在运行时,这个东西可以是一个空对象,也可以是 null 或未定义的。

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

例如

<Redirect to={{
  pathname: "/login",
  state: { from: "current-path }
 }} />
Run Code Online (Sandbox Code Playgroud)

反应路由器的 doco 说......

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

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

const { from }  = location.state || { from: { path: '/' } }
Run Code Online (Sandbox Code Playgroud)

我得到一个错误

Property 'from' does not exist on type '{} | { from: { path: string; }; }'.
Run Code Online (Sandbox Code Playgroud)

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

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

我在这里找到了与它相关的内容,它说将其转换为any. 所以我这样做了,因此:

const { from }  = location.state as any || { from: { path: '/' } }
Run Code Online (Sandbox Code Playgroud)

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


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

type PoorMansUnknown = {} | null | undefined;
Run Code Online (Sandbox Code Playgroud)

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

Oli*_*Ash 10

PoorMansUnknown应该等同于unknown类型。我们使用PoorMansUnknownwhen unknownis not available,即因为我们必须支持不支持该unknown类型的旧版 TypeScript 。

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

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

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

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