在Typescript中检查对象是否具有指定的键并使用该键

17

我有以下代码:

let show = {
    createTag: false,
    updateFeature: false,
    createFeatureGroup: false,
    deleteFeature: false,
    deleteCycle: false,
};

我从查询字符串中获取一个值,想要将其与show的键匹配。

以下代码可以正常工作,但我希望有一种让Typescript推断类型并避免使用强制转换的方法:

const showDialog = $page.query.get('show') || '';

if (showDialog && showDialog in show) {
    // I want to get rid of the "<keyof typeof show>" cast
    show[<keyof typeof show>showDialog] = true; 
}

我认为只需要在 show 中发出showDialog in show 的命令,typescript 就会知道在那个 if 语句中,show 是一个键,但事实并非如此。


2
in 狭化只适用于字符串字面量:https://www.typescriptlang.org/docs/handbook/2/narrowing.html#the-in-operator-narrowing - jonrsharpe
2个回答

15
@paolostyle 提供的类型守卫非常特定于 show 对象。以下代码片段更通用,适用于任何对象中的任何键:
export function isKeyOfObject<T>(
  key: string | number | symbol,
  obj: T,
): key is keyof T {
  return key in obj;
}

8
我不得不将其更改为 isKeyOfObject<T extends object> — 可能是由于 TypeScript 版本的差异? - Arthaey

8

你可以创建一个类型保护:

function isValidParam(k: string): k is keyof typeof show {
  return k in show;
}

const showDialog = $page.query.get('show') || '';

if (isValidParam(showDialog)) {
    show[showDialog] = true; 
}

但是你可以自行决定是否值得。就我个人而言,我可能会选择保留该内容。


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