typescript - Typescript 中的运行时属性
问题描述
我正在定义一个需要在运行时计算属性以避免冗余的对象。例如 :
export class Assessment {
items: Question[];
time?: number; // optional property
scoreTotal?: number; // runtime computed property (sum of questions scores)
}
export class Question {
score: number;
statement: string;
responses: string[];
correctResponse: string;
}
scoreTotal?
有效,但它可能会产生误导(人们可能认为它是可选的)。
还有另一种方法吗?
编辑:我希望避免使用方法,因为我多次阅读此属性。我想设置一次。
解决方案
分为Assessment
2种;有和没有scoreTotal
. 您可以使用“标记联合”类型最优雅地做到这一点。
interface AssessmentBase {
items: Question[];
time?: number; // optional property
}
interface AssessmentWithoutScoreTotal extends AssessmentBase {
type: "AssessmentWithoutScoreTotal",
}
interface AssessmentWithScoreTotal extends AssessmentBase {
type: "AssessmentWithScoreTotal",
scoreTotal: number; // runtime computed property (sum of questions scores)
}
type Assessment = AssessmentWithoutScoreTotal
& AssessmentWithScoreTotal;
当然,Assessment
将不再是一个类。但是您可以根据自己的需要制作AssessmentWithoutScoreTotal
或成为课程。AssessmentWithScoreTotal
但是,它真的必须是一个类吗?我发现普通接口在大多数情况下工作得更好。
尽管如此,您必须小心items
在计算 之后不要更改属性totalScore
,因此键入它也可能有意义:
interface Question {
readonly score: number;
statement: string;
responses: string[];
correctResponse: string;
}
interface AssessmentBase {
time?: number; // optional property
}
interface AssessmentWithoutScoreTotal extends AssessmentBase {
type: "AssessmentWithoutScoreTotal",
items: Question[];
}
interface AssessmentWithScoreTotal extends AssessmentBase {
type: "AssessmentWithScoreTotal",
scoreTotal: number; // runtime computed property (sum of questions scores)
readonly items: readonly Question[]; // Shouldn't mutate the scores anymore, since total has been precomputed.
}
type Assessment = AssessmentWithoutScoreTotal
& AssessmentWithScoreTotal;
推荐阅读
- c# - 如何检查设备上是否安装了 Microsoft Visual C++ 2015 Redistributable
- ionic-framework - 没有 http 客户端 Ionic 3 错误的提供程序
- python-3.x - 安装成功后出现“没有名为 wordcloud 的模块”
- javascript - 你如何在 Javascript 中逃避 try/catch 地狱?
- angular - Angular)在声明时有什么更好的方法来初始化类中对象的值吗?
- python - 位置参数和函数的问题
- firebase - 我的 Firebase 安全规则不允许我在其他用户的节点上写入,为什么?
- gradle - 如何在 Gradle 上设置依赖版本?
- java - 程序未正确读取 if/else 语句
- php - 如何在给定经度和纬度的情况下从 DB 获取到地点的距离