typescript - 使用字符串访问 TypeScript 可选对象属性

标签 typescript types typing strong-typing conditional-types

我正在现有的 JavaScript 代码库中工作。有一个类公开了预定义的函数(例如“复制”、“粘贴”)以供实用程序使用。该类可以用“扩展”函数实例化,允许用户注册其他实用函数以供以后使用。

此代码未键入,因此我尝试向签名添加类型。但是我在通过名称获取实用函数的函数(get(name))方面遇到了很多麻烦。代码的最小化版本(我尝试添加类型)如下:

class Operation {
    private extensions: {[key: string]: () => void}
    constructor(extensions: {[key: string]: () => void}) {
        this.extensions = extensions;
    }
    get(name: string): () => void {
        if (this[name]) {
            return this[name].bind(this)
        }
        if (this.extensions[name]) {
            return this.extensions[name].bind(this)
        }
        // default to copy
        return this.copy.bind(this);
    }
    copy() {
        console.log('copied');
    }
    paste() {
        console.log('pasted');
    }
}
const operation = new Operation({'cut': () => { console.log('cut'); }});
operation.get('cut')();

由于this[name]而失败:“元素隐式具有'any'类型,因为类型'Operation'没有索引签名ts(7053)”。

由于此函数旨在接受任意字符串(由于覆盖),因此我认为我无法避免将该函数键入为 get(name: string)。我无法从 TypeScript 文档中弄清楚如何使用 conditional types ,例如get(name: string | keyof Operation),我不相信这是正确的解决方案。

考虑到 name 不能保证是一个属性,(重新)构造和输入具有严格类型的 get(name) 函数的最佳方法是什么操作

最佳答案

检查(在 JavaScript 中,而不是 TypeScript)正在访问的 key 是否是您想要允许的直接在类上的 key 之一 - 例如 copypaste。然后,TS会自动推断允许此类访问。

get(name: string): () => void {
    if (name === 'copy' || name === 'paste') {
        return this[name].bind(this)
    }
    if (this.extensions[name]) {
        return this.extensions[name].bind(this)
    }
    // default to copy
    return this.copy.bind(this);
}

关于typescript - 使用字符串访问 TypeScript 可选对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71365070/

相关文章:

javascript - 从 Angular 中的孙组件访问祖组件属性

arrays - 在 typescript 中声明数组索引

php - php如何转换 bool 变量?

typing - 输入 () 的最佳方法是什么?

javascript - 如何避免 Angular observable 中的 "InternalError: too much recursion"?

angular - 错误 TS2304 : Cannot find name 'RTCPeerConnection'

python - python 中的递归类输入

javascript - 如何判断给定对象是数组还是对象?

c - 有许多不同类型的堆栈

c++ - C++中模板类型中的类层次结构