打字稿:为什么部分接口不能接受其他的领域?

问题描述 投票:1回答:2
interface User {
  name: string;
  age: number;  
}

let user: Partial<User> = {name: 'John', address: '123 Main st.'}

所以打字稿会抱怨address不会在接口User存在。我的理解是,只要Partial<User>是右侧对象的一个​​子集,它应该是一个有效的胁迫。如何正确理解呢?

typescript
2个回答
2
投票

这就是所谓的超额属性检验

从打字稿文档(https://www.typescriptlang.org/docs/handbook/interfaces.html#excess-property-checks):

...打字稿需要,有可能是在这个代码中的错误立场。对象字面得到特殊的处理,并进行多余的财产并将其分配给其他变量时,或将它们作为参数检查。如果一个对象的文字有“目标类型”没有任何属性,你会得到一个错误。

四处逛逛这些检查实际上是非常简单的。最简单的方法是只使用一个类型断言:


1
投票

@ABOS

什么Partial<User>为你做的有使用户界面特性可选。

与此类似,

interface User {
   name?: string;
   age?: number;
}

我觉得你真的想要做的是进一步扩展您的用户界面是什么,

interface User {
    name: string;
    age: number;
}


interface Mod extends User {
    address: string;
}

// this here then makes age from the user interface optional but also allows 
// you to now have the address property.

let user: Partial<Mod> = {name: "John", address: "123 Main st."};

或者你也可以通过做然后在类实现你的接口/ S像这样它更加坚固。

class Users implements Mod {
    address: string;
    name: string;
    age: number;

    // we can make the address and age defaulted values if not provided
    constructor(name: string, address: string = "", age: number = 0) {
        this.name = name;
        this.address = address;
        this.age = age;
    }
}

let user: Mod = new Users("John");

console.log(user.name);     // "John"
console.log(user.address);  // ""
console.log(user.age);      // 0
© www.soinside.com 2019 - 2024. All rights reserved.