有没有办法可以在运行时使用Typescript检查函数参数是否具有允许值?

时间:2014-08-22 15:07:27

标签: javascript typescript

我有一个用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

}

是否有某些方法可以消除对引用字符串的需求'检索',使用常量或检查运行时之前使用的值?

1 个答案:

答案 0 :(得分:2)

1。是否有某种方法可以消除对引用字符串的需求'检索'?

你可以去除过载,并提供许多不同版本的功能。

//just to give the idea
function setFalse_retrieve(){ return setFalse('retrieve') }

这样做的好处是它确实是类型安全的,并且无法用错误的参数调用setFalse。缺点是有很多样板,如果你愿意,你不能传递property值。

2。使用常量?

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; // :(

3。使用常量或检查运行时使用的值

Typescript在函数常量上有函数重载但是AFAIK,你只能根据输入使用它来专门化返回类型,而不是将有效输入限制为一组常量。也就是说,你仍然需要一个接受任何字符串的通用案例,这不是你想要的。