Typescript:为什么Partial Interface不接受其他字段?

时间:2019-02-05 19:50:31

标签: typescript

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

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

因此打字稿将抱怨接口address中不存在User。 我的理解是,只要Partial<User>是右侧对象的子集,它就应该是有效的强制。如何正确理解它?

2 个答案:

答案 0 :(得分:2)

它称为多余的财产检查

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

  

... TypeScript认为该代码中可能存在错误。将对象文字分配给其他变量或将其作为参数传递时,将对其进行特殊处理并进行过多的属性检查。如果对象文字具有“目标类型”所没有的任何属性,则会出现错误。

     

绕开这些检查实际上非常简单。最简单的方法是只使用类型断言:

答案 1 :(得分: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."};

或者您可以通过在类似的类中实现接口来使其更加健壮。

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