定义在获取数据后不再未定义的类型打字稿

Define type that is no longer undefined after data fetched Typescript

有没有办法告诉 TypeScript,如果之前在代码中进行了某个调用,则某个类型不再可为空?

例如,我调用了 API,然后我知道数据已定义。但是这个调用发生在应用程序代码外部 shell 的某个地方,所以当稍后使用时,数据已经被获取。

更具体地说,我正在使用 redux thunk 获取数据,然后数据存储在 redux 中。但是我的选择器都说 return 类型可能未定义。当然,我可以将我的选择器键入 return 不可空类型,但是我需要注意我在哪里使用选择器。

TypesScript 是否有任何优雅的方式或功能可以比定义多种类型的选择器更好地解决这个问题?您对这个常见问题的处理方法是什么?

如果您在 知道 的地方使用数据,它将是非 null,您可以使用断言类型保护(最好的 link我现在能找到的就是在3.7 release notes)。你这样定义它:

function assertNotNull<T>(data: T | null): asserts data is T {
    if (data === null) {
        throw new Error(`null was found unexpectedly`);
    }
}

那么你在哪里使用数据:

assertNonNull(theData);
// ...here, `theData`'s type has been narrowed by TypeScript to no longer include `null`...

除了确保 TypeScript 数据变量不是 null 之外,这还记录并检查了您是否相信它不能 null 在您使用它的地方。

Example on the playground