TypeScript:如何在类中拥有对象,然后在构造函数中使用它

TypeScript: How to have object within a class and then use it in constructor

提问人:Gabriel Atanasov 提问时间:11/5/2023 更新时间:11/5/2023 访问量:40

问:

问题

我正在创建一个包含很多变量的类。它们中的大多数都是逻辑分组的,我想利用 IDE (VS Code) 自动建议的优势。

问题是有很多变量,我不想预先列出所有变量,我想有嵌套,所以如果我创建,那么当我开始键入 IDE 以启动第一级自动建议所有瘦身时,例如,...等。const movie1 = new Movie(1, 101);movie1.idtitle

然后,当我进一步键入时,IDE会给我提示该对象具有,例如,,和。movie1.titlebgenoriginal

实际结果

VS Code 给了我提示。但是当我运行脚本时,我收到运行时错误

this.id.googlesheet.row = rowID;
        ^


TypeError: Cannot read properties of undefined (reading 'googlesheet')
    at Movie (~/src/classes/Movie.ts:12:17)
    at <anonymous> (~/src/index.ts:5:16)
    at Object.<anonymous> (~/src/index.ts:8:44)
    at Module._compile (node:internal/modules/cjs/loader:1241:14)
    at Object.j (~/dist/cjs/index.cjs:1:1197)
    at Module.load (node:internal/modules/cjs/loader:1091:32)
    at Module._load (node:internal/modules/cjs/loader:938:12)
    at cjsLoader (node:internal/modules/esm/translators:283:17)
    at ModuleWrap.<anonymous> (node:internal/modules/esm/translators:233:7)
    at ModuleJob.run (node:internal/modules/esm/module_job:217:25)

我认为我从根本上做错了,我尝试使用接口,但我以死胡同告终。

文件

来源/index.ts

import { Movie } from "./classes/Movie";

const movieList: Movie[] = [];

const movie1 = new Movie(1, 101);
const movie2 = new Movie(2, 102);

console.log(movieList[0].id.googlesheet.row);

src/类/Movie.ts

export class Movie {
    id: { googlesheet: { row: number; movie: number; }; wordpress?: { bg?: number; en?: number; }; };
    title: { bg: string; en: string; original?: string; };
    metadata: { duration: string; yearOfProduction: string; };
    country: { bg: string; en: string; };
    description: { bg: string; en: string; };
    director: { bg: string; en: string; };
    trailer: { url: string; };
    featuredImage: { url: string; };

    constructor(rowID: number, movieID: number) {
        this.id.googlesheet.row = rowID;
        this.id.googlesheet.movie = movieID;
    }
}
JavaScript TypeScript 对象

评论

1赞 InSync 11/5/2023
您需要先创建属性:。它们不仅神奇地栩栩如生。this.id = {}; this.id.googlesheet = {}; // Or whatever
0赞 Gabriel Atanasov 11/5/2023
@InSync我在构造函数中创建它们。也许我没有跟着你。
0赞 InSync 11/5/2023
你不是,因此是错误的。你甚至应该被警告
0赞 jcalz 11/6/2023
您应该考虑使用 --strict 编译器选项进行编译,或者至少(在本例中)使用 --strictPropertyInitialization 选项进行编译。这将捕获您在此处遇到的错误,实际上您尚未初始化您的属性。这是否完全解决了这个问题?如果是这样,我可以写一个答案来解释;如果没有,我错过了什么?

答: 暂无答案