gpt4 book ai didi

typescript - 动态类型保护功能

转载 作者:行者123 更新时间:2023-12-04 12:35:39 25 4
gpt4 key购买 nike

我想创建一个类型保护函数来检查对象中的特定键是否具有例如string值(value)。如果我知道键名,这很容易:

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);
}

但是当我需要检查更多 key 时,这会变得困惑:

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;
}

这可能吗?如何?

最佳答案

你很接近。我将使用类型参数来捕获项目的字符串文字类型,而不是整个字符串数组。并且您需要使用映射类型而不是索引签名,您可以自己编写它( { [ k in K ]: string } )但是预定义的 Record类型也应该工作:

const data: object = { a: 'one', b: 'two', c: 'three' };

if (hasStringKeys(data, ['a', 'b', 'c'])) {
console.log([ data.a, data.c, data.b ].join(', '));
}

function hasStringKeys <K extends string> (data: any, keys: K[]): data is Record<K, string> {
for (const key of keys) {
if (typeof data[key] !== 'string') {
return false;
}
}
return true;
}

Playground Link

关于typescript - 动态类型保护功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62081948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com