TypeScript:强制类参数类型而不干扰键

我需要定义一个用于我的应用程序的“操作”模式。这个模式应该可以扩展到其他的“操作”组。它应该包含每个关键字的设置字典。

在某些情况下,“泛型调用者”应该接收“操作”的类型加上关键字,并为以后的调用创建一个缓存。

我还需要这个“通用调用者”来确保请求的关键字是在编译时在操作上定义的,这样它就会向VS Code上的开发人员显示错误。

下面是一个非常接近我需要的解决方案:

// Operation interface
interface Operation {
    url: string
    parameters: Record<string,string>
}

// Operations schema
class Operations {}
class BaseOperations extends Operations {   
    one: {
        url: '/one',
        parameters: {p: '1'}
    }
    two: {
        url: '/two',
        parameters: {}
    }
}

// Generic caller (which caches the calls)
function runOperation<T extends Operations>(type: {new(): T;}, keyword: keyof T) {
    let operation = new type();
    //cache_and_run(operation[keyword]);
}

// Main
function main() {
    runOperation(BaseOperations, 'one');
    runOperation(BaseOperations, 'two');
    runOperation(BaseOperations, 'three'); // VS Code error, as expected
}

这里唯一的问题是Operations中定义的参数没有绑定到Operation接口。这是一个小问题,但是我希望能够确保在编译时检查两端(操作定义和它们的使用)。

经过一些研究,我找到了"index some“参数,它允许强制执行返回类型:

class BaseOperations extends Operations {
    [x:string]: Operation
    one: {
        url: '/one',
        parameters: {p: '1'}
    }
    two: { // 'uarl' is not assignable
        uarl: '/two'
    }
}

但是,这种方法禁用了在runOperation上进行的'one'|'two'检查,因为现在任何字符串都是有效的keyof BaseOperations

有什么建议吗?

转载请注明出处:http://www.xingnongyuan.com/article/20230527/2098446.html