开发者问题收集

Typescript 接口未捕获的 TypeError:无法设置属性

2019-02-10
79

我正在尝试向对象添加类型断言,在为嵌套对象分配值时遇到 TypeError。

这是代码片段

interface Person {
    age: number;
    name: string;
    study: {
        schoolName: string
    }
}

let john = {} as Person;

john.age = 25;
john.name = 'John';
john.study.schoolName = 'some school';

console.log(john); // Uncaught TypeError: Cannot set property 'schoolName' of undefined

Typescript 游乐场的链接 链接

3个回答

也许看看 编译版本 的代码片段将为您清除它

var john = {};
john.age = 25;
john.name = 'John';
john.study.schoolName = 'some school';
console.log(john);

如您所见,Typescript 实际上并未初始化 study 属性。

3mard
2019-02-10

因为接口实际上并没有“创建”你的对象。 在你开始分配值之前,在你的代码中,john 只是一个空对象。你可以给它分配属性(年龄、姓名等),因为这是正常的。 你试图将一个属性分配给一个不存在的对象属性。要么使用类并使用构造函数初始化它。或者有一个函数可以正确地从该“接口”创建对象。

基本上,接口只是 TypeScript 中的一个花哨的东西,用来防止开发人员的拼写错误等。它不会在幕后创建任何东西。

Ales
2019-02-10

Typescript 只会告诉您的 IDE 这个新对象具有哪些类型。它不会为您创建完整的对象。

以下是您想要创建对象的方式:

interface Person {
    age: number;
    name: string;
    study: {
        schoolName: string
    }
}

let john = {} as Person;

john.age = 25;
john.name = 'John';
john.study = { 
    schoolName: 'some school'
};

console.log(john); 

或者您可以直接执行以下操作:

let john: Person = {
    age: 25;
    name: 'John';
    study: {
        schoolName: 'some school'
    }
};
Marvin Fischer
2019-02-10