我有一个用Typescript编码的AngularJS服务。我使用类似setFalse的参数调用服务的函数(' retrieve'):
class StateService implements IStateService {
state = [];
get = (property: string) => {
return this.state[property];
}
setFalse = (property: string) => {
this.state[property] = false;
}
setNull = (property: string) => {
this.state[property] = null;
}
setTrue = (property: string) => {
this.state[property] = true;
}
// more code here
}
是否有某些方法可以消除对引用字符串的需求'检索',使用常量或检查运行时之前使用的值?
答案 0 :(得分:2)
你可以去除过载,并提供许多不同版本的功能。
//just to give the idea
function setFalse_retrieve(){ return setFalse('retrieve') }
这样做的好处是它确实是类型安全的,并且无法用错误的参数调用setFalse。缺点是有很多样板,如果你愿意,你不能传递property
值。
Typescript具有枚举功能:
enum Properties { retrieve, frobnicate };
您现在可以使用Properties.retrieve
代替"检索"在你的代码中,它将捕获枚举名称中的任何拼写错误。
Properties.retriev; // Error: The property 'retriev' does not exist on value of type 'typeof Properties'.
请注意,Typescript使枚举值为整数,因此在调用Angular函数时需要将它们转换为字符串:
var enumProperty = Properties.retrieve; // 0
var strProperty = Properties[enumProperty]; // "retrieve"
枚举方法的缺点是你可以传递任何预期枚举值的数字,并且在运行时不会检测到错误(不要这样做):
var x:Property = 10; // :(
Typescript在函数常量上有函数重载但是AFAIK,你只能根据输入使用它来专门化返回类型,而不是将有效输入限制为一组常量。也就是说,你仍然需要一个接受任何字符串的通用案例,这不是你想要的。