接口中的Typescript嵌套属性不是必需的?

3okqufwl  于 2023-06-07  发布在  TypeScript
关注(0)|答案(2)|浏览(108)

我有一个嵌套对象的接口:

export interface Person {
    PersonWrapper: {
        name: string;
        address: string
        email?: string;
    }
}

如果我尝试从它创建一个对象,似乎 name 不是必需的,但它应该是。它在接口中没有定义为可选属性。下面是我如何创建它:

const payload = {
    PersonObj: {
        address: '123 memory lane'
    }
} as Person;

为什么我没有得到编译时错误,说 name 是必需的?如果我忘记将它 Package 在 PersonWrapper 中,那么我肯定会得到错误。

wlp8pajw

wlp8pajw1#

由于您没有使用类型注解,而是使用类型Assert,因此对于编译器来说,您与Person足够接近,因此它不会抱怨缺少属性。要修复它,请改用类型注解:

// expected error
const payload: Person = {
  PersonWrapper: {
    address: "123 memory lane",
  },
};

您可以在这里阅读更多关于类型注解和Assert之间的区别

u5rb5r59

u5rb5r592#

TypeScript区分:
1.类型注解

let name: string;

1.类型Assert

let name = getSomeValue() as string;

根据TypeScript文档,与类型注解(更严格)相比,类型Assert是松散的:
TypeScript只允许类型Assert转换为更具体或更不具体的类型版本。该规则防止“不可能的”强制[…]
SOURCE:https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#type-assertions

相关问题