检查对象在 Typescript 中是否有键并使用该键

ope*_*sas 17 casting key object hasownproperty typescript

我有以下代码:

let show = {
    createTag: false,
    updateFeature: false,
    createFeatureGroup: false,
    deleteFeature: false,
    deleteCycle: false,
};
Run Code Online (Sandbox Code Playgroud)

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

下面的代码工作正常,但我想要一种方法让 Typescrpt 推断它并避免必须发出强制转换:

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; 
}
Run Code Online (Sandbox Code Playgroud)

我虽然只是发出showDialog in show打字稿就会知道 showDialog 里面if是 的键show,但情况似乎并非如此。

Jas*_*rus 15

@paolostyle 提出的类型保护对于show对象来说是非常特定的。以下代码片段更通用,可用于任何对象中的任何键:

export function isKeyOfObject<T>(
  key: string | number | symbol,
  obj: T,
): key is keyof T {
  return key in obj;
}
Run Code Online (Sandbox Code Playgroud)

  • 我必须将其更改为“isKeyOfObject&lt;T extends object&gt;”——可能是由于 Typescript 版本差异? (8认同)

tup*_*tus 9

您可以创建类型保护:

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; 
}
Run Code Online (Sandbox Code Playgroud)

但你决定是否值得。我个人可能会保留演员阵容。