当我将接口的任何属性设置为可选时,并将其成员分配给其他变量,如下所示:
interface Person {
name?: string,
age?: string,
gender?: string,
occupation?: string,
}
function getPerson() {
let person = <Person>{name:"John"};
return person;
}
let person: Person = getPerson();
let name1: string = person.name; // <<< Error here
我得到如下错误:
TS2322: Type 'string | undefined' is not assignable to type 'string'.
Type 'undefined' is not assignable to type 'string'.
如何避免这个错误呢?
这里有一个快速的方法来了解正在发生的事情:
当你做以下事情时:
的名字吗?:字符串
你对TypeScript说它是可选的。然而,当你这样做的时候:
let name1 : string = person.name; //<<<Error here
你没有给它选择的余地。你需要在它上面有一个反映未定义类型的联合:
let name1 : string | undefined = person.name; //<<<No error here
使用您的回答,我能够概述以下内容,基本上是一个接口,一个类和一个对象。我发现这种方法更简单,如果你不这样做也没关系。
// Interface
interface iPerson {
fname? : string,
age? : number,
gender? : string,
occupation? : string,
get_person?: any
}
// Class Object
class Person implements iPerson {
fname? : string;
age? : number;
gender? : string;
occupation? : string;
get_person?: any = function () {
return this.fname;
}
}
// Object literal
const person1 : Person = {
fname : 'Steve',
age : 8,
gender : 'Male',
occupation : 'IT'
}
const p_name: string | undefined = person1.fname;
// Object instance
const person2: Person = new Person();
person2.fname = 'Steve';
person2.age = 8;
person2.gender = 'Male';
person2.occupation = 'IT';
// Accessing the object literal (person1) and instance (person2)
console.log('person1 : ', p_name);
console.log('person2 : ', person2.get_person());
解决方案1:删除显式类型定义
因为getPerson已经返回了一个带有名称的Person,所以我们可以使用推断类型。
function getPerson(){
let person = {name:"John"};
return person;
}
let person = getPerson();
如果我们定义person: person,我们将丢失一条信息。我们知道getPerson返回一个具有非可选属性name的对象,但是将其描述为Person会使可选性恢复。
解决方案2:使用更精确的定义
type Require<T, K extends keyof T> = T & {
[P in K]-?: T[P]
};
function getPerson() {
let person = {name:"John"};
return person;
}
let person: Require<Person, 'name'> = getPerson();
let name1:string = person.name;
解决方案3:重新设计界面
所有属性都是可选的形状称为弱类型,通常是设计不好的标志。如果我们将name作为必需属性,那么您的问题就解决了。
interface Person {
name:string,
age?:string,
gender?:string,
occupation?:string,
}