![](/img/trans.png)
[英]Why does TypeScript not allow a generic enum value as default parameter value
[英]typescript enum default value
我刚刚开始使用 Aurelia 框架学习 Typescript。 我已经使用 ViewEngineHooks http://davismj.me/blog/template-constants/在 Aurelia 的 Todo 应用程序中实现了 Matthew Davis 的博客 TypeScript Enums in Aurelia Templates。
我想将默认枚举值设置为列表中的第二个值,并将默认值设置为列表中的第一个值。
另外,我想知道 {Todo, Priority} 还是仅 {Todo} 需要导入,如 todo-list.ts 所示
待办事项
// Pro Tip: By starting our enum at 1, we ensure that all values in the enum are truthy.
export enum Priority {
High = 1,
Medium,
Low
}
export class Todo {
@observable done;
//*** Setting priority: Priority = 2 OR priority: Priority = Priority.Medium - Does not change the default from High / 1 ***
//constructor(public list: TodoList, public description: string, public priority: Priority = 2, public editing: boolean = false) {
constructor(public list: TodoList, public description: string, public priority: Priority = Priority.Medium, public editing: boolean = false) {
this.list = list;
this.description = description;
//*** Setting this.priority = 2 OR this.priority = Priority.Medium - Does not change the default from High / 1 ;
//this.priority = 2;
this.priority = Priority.Medium;
this.editing = false;
}
待办事项列表.ts
//*** Is {Todo} OR {Todo, Priority} needed for importing? ***
//import {Todo} from './todo';
import {Todo, Priority} from './todo';
...
add(description) {
if (description) {
//*** Setting (this, description, 2) OR (this, description, Priority.Medium) - Does not change the default from High / 1 ***
//this.todos.push(new Todo(this, description, 2));
this.todos.push(new Todo(this, description, Priority.Medium));
this.invalidateView();
}
}
待办事项.html
<select id="priority" value.bind="type">
<option value.bind="Priority[type]" repeat.for="type of Prioritys">${type}</option>
</select>
据我所知,在声明变量时不能设置枚举的默认值,就像数字或布尔值没有默认值一样。 但是,您可以为函数参数定义一个默认值,就像您在构造函数中所做的那样( priority: Priority = Priority.Medium
),这样您就不必在调用构造函数时提供该参数。
两个附加说明:不应该是this.priority = priority; this.editing = editing;
this.priority = priority; this.editing = editing;
而不是this.priority = Priority.Medium; this.editing = false;
this.priority = Priority.Medium; this.editing = false;
? 其次,如果你把public
放在参数前面,类属性会自动添加和分配,因此你不需要构造函数的额外行。 但是,对于更复杂的类,我可能会手动创建和分配属性。
关于您的第二个问题:您需要在引用该枚举后立即导入Priority
,例如在编写Priority.Medium
。 您不必导入它,例如,当您比较Priority
类型的两个不同属性而不使用枚举名称时(例如this.todos[0].priority === this.todos[1].priority
)。
<option>
上使用model.bind
没有任何改变的原因是因为没有将正确的值“分配”给<option>
。 为此,您需要使用model
属性。
<select id="priority" value.bind="type">
<option model.bind="Priority[type]" repeat.for="type of Priorities">
${type}
</option>
</select>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.