复杂类型对象中可选 属性 的打字稿类型

Typescript type of optional property within complex type object

我正在尝试获取在复杂类型中找到的可选 属性 的 type,如下例所示。解决起来可能很简单,但我找不到解决方案。

type ComplexType = {
    lvl0: {
        title: string;
        lvl1: {
            title: string;
            lvl2?: {
                title: string;
                lvl3: {
                    title: string;
                }
            }[]
        }[]
    }[]
}

type lvl3Type = ComplexType["lvl0"][0]["lvl1"][0]["lvl2"][0]["lvl3"];

Typescript Playground

最后一个 [0] 有错误。我将如何解决 lvl3Type

你的错误,强调我的:

Property '0' does not exist on type '{ title: string; lvl3: { title: string; }; }[] | undefined'.

正如您的问题标题,lvl2 是可选的:它被定义为 lvl2?。如果 lvl2 未定义,lvl2[0] 将抛出错误,因此 TypeScript 告诉您不能将 [0] 应用于可能未定义的类型。

使用 utility type NonNullable<T> 来避免这个问题并获得你想要的类型。

type lvl3Type =
    NonNullable<ComplexType["lvl0"][0]["lvl1"][0]["lvl2"]>[0]["lvl3"];

不幸的是,您需要这样的实用程序而不是 !,正如 kaya3 在评论中指出的那样: ! 仅适用于表达式,不适用于类型,以表明表达式 value 不为空或未定义。