在接口中嵌套的属性是否是必需的?

huangapple go评论62阅读模式
英文:

Typescript nested property in interface isn't required?

问题

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

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

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

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

为什么我没有得到编译时错误,指出*name*是必需的?如果我忘记将其包装在*PersonWrapper*中,那么我肯定会得到错误。
英文:

I've got an interface with a nested object:

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

If I try and create an object from it, it seems that name is not required, but it should be. It's not defined as an optional property in the interface. Here's how I create it:

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

Why aren't I getting a compile-time error saying that name is required? If I forget to wrap it in PersonWrapper then I definitely get an error.

答案1

得分: 5

由于您没有使用 类型注解,而是使用 类型断言,对于编译器而言,您已经接近 Person,因此它不会因为缺少属性而抱怨。要修复它,请改用类型注解:

// 预期错误
const payload: Person = {
  PersonWrapper: {
    address: "123 memory lane",
  },
};

您可以在 这里 阅读有关类型注解和类型断言之间的区别。

英文:

Since you are not using type annotation but using type assertion, for the compiler, you are close enough to the Person, thus it doesn't complain about the missing properties. To fix it, use type annotation instead:

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

You can read more about the difference between type annotation and assertion in here

答案2

得分: 2

  1. 类型注解
    let name: string;
    
  2. 类型断言
    let name = getSomeValue() as string;
    

根据 TypeScript 文档,类型断言比类型注解更宽松:

TypeScript 只允许将类型断言转换为更具体或更不具体的类型版本。此规则防止了“不可能的”强制转换[...]

来源:https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#type-assertions

英文:

TypeScript distinguish:

  1. Type Annotation
    let name: string;
    
  2. Type Assertion
    let name = getSomeValue() as string;
    

As per TypeScript document, type assertion is loose, compared to type annotation (which is stricter):

> TypeScript only allows type assertions which convert to a more specific or less specific version of a type. This rule prevents “impossible” coercions [...]
>
> SOURCE: https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#type-assertions

huangapple
  • 本文由 发表于 2023年6月6日 04:46:19
  • 转载请务必保留本文链接:https://go.coder-hub.com/76409892.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定