可以声明具有扩展的调用签名的接口
WshEnvironment
// Added for testing
declare interface WshEnvironment{
(name: 'OS'): string
}
declare interface WshEnvironmentWithInvoke extends WshEnvironment {
(Type: 'System' | 'User' | 'Proces' | 'Volatile'): WshEnvironment;
}
declare interface WshShell {
Environment: WshEnvironmentWithInvoke;
}
let shell: WshShell;
shell.Environment("System")("OS");
shell.Environment("OS");
编辑
上述解决方案确实允许进行如下调用:
let env = x.Environment;
let filteredEnv = env('System');
不幸的是,没有办法在Typescript中正确地键入此内容,基本上就是拥有一个属性,该属性在从对象中分配出去时会丢失一些属性)。我会优化常见场景,这里似乎是您指定参数的版本,主要是因为文档中的这一行:
如果未提供strType,则Environment属性将根据操作系统返回不同的环境变量类型。
我希望创建一个helper函数来为cast提供一些上下文,而不是内联执行:
declare interface WshEnvironment{
(name: 'OS'): string
}
declare interface WshShell {
Environment (Type?: 'System' | 'User' | 'Proces' | 'Volatile'): WshEnvironment
}
function defaultEnvironment(shell: WshShell) :WshEnvironment {
return shell.Environment as any;
}
var shell: WshShell = new ActiveXObject('WScript.Shell');
var s = defaultEnvironment(shell);
WScript.Echo(s("OS"));
WScript.Echo(shell.Environment('System')("OS"));