检查对象是否在 Typescript 中有键并使用该键
check if object has key in Typescript and use that key
我有以下代码:
let show = {
createTag: false,
updateFeature: false,
createFeatureGroup: false,
deleteFeature: false,
deleteCycle: false,
};
我从查询字符串中得到一个值,我想再次匹配显示的键。
下面的代码工作正常,但我想要一种方法让 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;
}
我虽然只是发布 showDialog in show
打字稿就知道 if
showDialog 是 show
的关键,但似乎并非如此。
您可以创建类型保护:
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;
}
但您决定是否值得。我个人可能会保留演员阵容。
@paolostyle 提供的类型保护非常特定于 show
对象。以下代码段更通用,可用于任何对象中的任何键:
export function isKeyOfObject<T>(
key: string | number | symbol,
obj: T,
): key is keyof T {
return key in obj;
}
我有以下代码:
let show = {
createTag: false,
updateFeature: false,
createFeatureGroup: false,
deleteFeature: false,
deleteCycle: false,
};
我从查询字符串中得到一个值,我想再次匹配显示的键。
下面的代码工作正常,但我想要一种方法让 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;
}
我虽然只是发布 showDialog in show
打字稿就知道 if
showDialog 是 show
的关键,但似乎并非如此。
您可以创建类型保护:
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;
}
但您决定是否值得。我个人可能会保留演员阵容。
@paolostyle 提供的类型保护非常特定于 show
对象。以下代码段更通用,可用于任何对象中的任何键:
export function isKeyOfObject<T>(
key: string | number | symbol,
obj: T,
): key is keyof T {
return key in obj;
}