【问题标题】:How to define type of an object whose properties are going to be fetched from an array in TypeScript如何定义要从 TypeScript 中的数组中获取属性的对象的类型
【发布时间】:2021-02-12 01:55:44
【问题描述】:

如何定义要从 TypeScript 中的数组中获取属性的对象的类型。

在下面的例子中,如何定义lookUpMap对象的类型?

const arr1 = ["a", "b", "c", "d"];
const arr2 = ["x", "y", "b"];

class Arr {
    
    private lookUpMap = {}
    
    constructor(private arr1: string[], private arr2: string[]){}    
    
    linearCompare(){
        for(let i of this.arr1){
            this.lookUpMap[i] = true
        }
        
        for(let i of this.arr2){
            if(this.lookUpMap[i]){
                return console.log(true);
            }
        }
        return console.log(false);
    }
}

const arrComp = new Arr(arr1, arr2);
arrComp.linearCompare()

谢谢

【问题讨论】:

    标签: javascript typescript casting typeerror typescript-typings


    【解决方案1】:

    对于lookupMap,我能想到的最直接的类型是一个类字典对象,其属性为true | undefined 类型的string index signature

      private lookUpMap: { [k: string]: true | undefined } = {}
    

    这将让您将true 写入任何字符串值键,如this.lookUpMap[i] = true,并了解当您从字符串值键读取时,结果将是trueundefined,如if (this.lookupMap[i]) {...}

    请注意,这与您的密钥来自数组这一事实无关; lookupMap 将允许您使用任何 string 对其进行索引。

    Playground link to code

    【讨论】:

    • 想知道这样的事情是否可行:const arr1 = ["a", "b", "c", "d"] as const; type ArrKey = {[key in typeof arr1[number]]: true};
    • 你可以试试,但由于arr1 在类之外,然后传递到类的属性中,你需要类是通用的来跟踪这个......然后寻找增加arr2 的元素会很烦人,因为它不会被认为是lookupMap 的键。
    猜你喜欢
    • 2022-11-13
    • 2020-03-17
    • 2020-04-14
    • 2019-06-28
    • 2018-05-29
    • 1970-01-01
    相关资源
    最近更新 更多