错误:类型“{}”缺少类型中的以下属性

Acd*_*cdn 12 javascript interface object typescript

interface Person {
  name: string;
  surname: string;
}
let person1: Person = {};

person1.name = "name"
person1.surname = "surname"
Run Code Online (Sandbox Code Playgroud)

当我声明 person1 时,出现此错误:

Type '{}' is missing the following properties from type Person

qiA*_*lex 25

这是一个更好的方法:

let person1: Person = {name: '', surname: ''};
Run Code Online (Sandbox Code Playgroud)

但是如果你想要完全空的对象,那么你可以像这样破解它:

let person1: Person = {} as Person;
Run Code Online (Sandbox Code Playgroud)

评论后更新:

看这个unpredictableFunction

const unpredictableFunction = (): string|number|string[] => {
  return Math.random() > 0.5 ? 'string' : Math.random() > 0.5 ? 9999 : ['1', '2', '3']
};
Run Code Online (Sandbox Code Playgroud)

它可能返回数字,也可能返回字符串,或者可能返回字符串数组

const person: Person = {name: '', surname: ''};
person.name = unpredictableFunction (); // this is a case you are talking about
Run Code Online (Sandbox Code Playgroud)

在这种情况下你会看到

Type 'string | number | string[]' is not assignable to type 'string'.

答案是:

查看您的代码并确保仅将字符串分配给 Person 属性,

或者更新接口以准备不同的值:

interface Person {
  name: string | number | string[];
  surname: string; 
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*hyn 9

您已经定义了一个具有两个必需属性的接口。因此,当您定义具有 Person 接口类型的对象时,您必须立即定义这些属性,如下所示:

let person: Person = {
    name: '',
    surname: ''
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您认为这些属性不是必需的而是可选的,您可以将界面更改为:

interface Person {
    name?: string;
    surname?: string;
}
Run Code Online (Sandbox Code Playgroud)

使用?语法将属性标记为可选。下面的代码应该可以工作:

let person: Person = {};
Run Code Online (Sandbox Code Playgroud)