为什么要使用 Object.keys(this).map(key => (this as any)[key]) ?

3

我在审查这个方法,我很好奇为什么它使用Object.keys(this).map(key => (this as any)[key])?是否只调用Object.keys(this).indexOf(type) !== -1也是有效的:

/**
 * Checks if validation type is valid.
 */
static isValid(type: string) {
    return  type !== "isValid" &&
        type !== "getMessage" &&
        Object.keys(this).map(key => (this as any)[key]).indexOf(type) !== -1;
} 

1
它将键映射到值,可能适用于尚不支持“Object.values”的JavaScript版本。 - ASDFGerte
@Derek 箭头函数是 ES2015 的一部分,但 Object.values 直到 ES2017 才被包含进来。 - Paul
我知道这个。但那不是我想表达的重点。 - Derek Pollard
1
TypeScript 的目标可能是 ES6,这意味着 TSC 不能使用 Object.values,但可以使用箭头函数。 - ASDFGerte
1
TypeScript不会填充功能,它只会下放句法结构。如果你想在ES5中使用这个功能,你需要使用一个外部polyfill库,比如core-js。换句话说,我之前关于TSC和Object.values的评论是胡言乱语,相关代码仍然是TypeScript,TSC不会填充。 - ASDFGerte
显示剩余8条评论
1个回答

4

这行代码并不会创建一个对象的键名数组,而是创建一个对象的数组,并检查type是否包含在数组中。如果改写得更加清晰,可以如下:

/**
 * Checks if validation type is valid.
 */
static isValid(type: string) {
  return  type !== "isValid" &&
    type !== "getMessage" &&
    Object.values(this).includes(type);
} 

(当然需要的话包括polyfills)

啊好的 - 在 this as any 这部分让我有些困惑 - 我猜测 map 子句内的 this 是指数组吧? - Ole
不,这个值的数组是由 Object.values(this) 创建的。虽然不知道 this 指的是什么,因为没有任何上下文说明,但我假设它只是一些带有键值对的对象。 - CertainPerformance
我指的是原始示例中的 this。如果我理解正确,在 Object.keys(this) 中使用的 this 部分是包含静态 isValid 方法的类的原型,嗯...好吧...我认为在任何情况下这都是相同的东西。如果我理解正确,它始终是与类定义对应的原型。 - Ole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接