我想创建一个类型保护函数来检查对象中的特定键是否具有例如Astring
价值。如果我知道键名,这很容易:
const data: object = { a: 'one', b: 'two', c: 'three' };
function hasStringKeyA(data: any): data is { a: string } {
return typeof data.a === 'string';
}
if (hasStringKeyA(data)) {
console.log(data.a);
}
但是当我需要检查更多密钥时,这会变得混乱:
if (hasStringKeyA(data) && hasStringKeyB(data)) {
console.log([ data.a, data.b ].join(', '));
}
我想做的是:
if (hasStringKeys(data, ['a', 'b', 'c'])) {
console.log([ data.a, data.c, data.b ].join(', '));
}
但我不知道如何编写可以通过这种方式参数化的类型保护函数。这是一个糟糕的尝试,但行不通:
function hasStringKeys <K extends string[]> (data: any, keys: Keys): data is { [ k: typeof K ]: string } {
for (const key of keys) {
if (typeof data[key] !== 'string') {
return false;
}
}
return true;
}
这可能吗?如何?