是否有一种方法可以检查函数参数在Typescript运行之前是否有一个允许的值

Is there a way I can check a function parameter has an allowed value before runtime with Typescript?

本文关键字:是否 运行 Typescript 有一个 参数 函数 一种 方法 检查      更新时间:2023-09-26

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

是否有一些方法,我可以删除引号字符串"检索"的需要,使用常量或检查运行前使用的值?

是否有一些方法,我可以删除引号字符串"检索"的需要?

可以对重载进行简化,并提供该函数的许多不同版本。

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

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

2。用常数?

Typescript有一个enum特性:

enum Properties { retrieve, frobnicate };

你现在可以在代码中使用Properties.retrieve代替"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在函数常量上有函数重载,但是你只能用它来根据输入来专门化返回类型,而不是把你的有效输入限制在一组常量上。也就是说,您仍然需要有一个接受任何字符串的通用大小写,这不是您想要的。