gpt4 book ai didi

typescript 用户定义的类型保护检查对象具有数组中的所有属性

转载 作者:行者123 更新时间:2023-12-05 02:09:26 26 4
gpt4 key购买 nike

我正在尝试写一个 user-defined type guard测试给定的值是否具有给定数组中的所有属性。

我调用这个函数 hasAll它在 Javascript 中的实现和用法如下所示:

function hasAll(obj, keysToCheck) {
if (!obj) return false;

for (const key of keysToCheck) {
const value = obj[key];
if (value === null) return false;
if (value === undefined) return false;
}

return true;
}

hasAll({ foo: 'test', bar: 5 }, ['foo', 'bar']); // true

hasAll({ foo: 'test', bar: 5 }, ['foo', 'bar', 'baz']); // false

我现在要做的是将上面的函数变成一个 type guard .这是我目前所拥有的:

// this _almost_ works 🔴
type Nullable<T> = T | null | undefined;

type RemoveNullables<T, K extends keyof T> = {
[P in K]-?: T[P] extends Nullable<infer U> ? U : T[P];
};

function hasAll<T, K extends keyof NonNullable<T>>(
obj: T,
keysToCheck: K[],
): obj is RemoveNullables<NonNullable<T>, K> {
// but i'm getting an error here 👆👆👆
if (!obj) return false;

const nonNullableObj = obj as NonNullable<T>;

for (const key of keysToCheck) {
const value = nonNullableObj[key];
if (value === null) return false;
if (value === undefined) return false;
}

return true;
}

export default hasAll;

playground link


错误信息是:

A type predicate's type must be assignable to its parameter's type.
Type 'RemoveNullables<NonNullable<T>, K>' is not assignable to type 'T'.

我读过 this answer有一个很好的解释,但这对我的情况并没有真正的帮助。

我想明确断言我的类型 T将符合 RemoveNullables<NonNullable<T>, K>在它运行完这个函数之后。我真的不在乎是否T可分配给 RemoveNullables<NonNullable<T>, K> (如果这有意义的话)。


  1. 我做错了吗?有没有更好的方法来编写这种类型保护?
  2. 如果这种方法没问题,我如何告诉 typescript 我不关心类型保护本身是否“不安全”?

最佳答案

这似乎符合您的要求:

type ExcludeNullable<T, K extends keyof NonNullable<T>> = NonNullable<T> & {
[k in K]-?: Exclude<NonNullable<T>[k], null | undefined>
}

function hasAll<T, K extends keyof NonNullable<T>>(
obj: T,
keysToCheck: K[]
): obj is ExcludeNullable<T, K> {
return obj !== null && obj !== undefined
&& keysToCheck.every(k => obj![k] !== null && obj![k] !== undefined);
}

一些注意事项:

  • T & ...交集类型保证 ExcludeNullable<T, K>可分配给 T .没有这个,映射类型就没有 T 的属性。 K 中缺少的.
  • Exclude是摆脱 null 的更简单方法和 undefined比使用 infer 的条件类型.
  • 我冒昧地简化了 hasAll功能实现一点。

Playground Link

关于 typescript 用户定义的类型保护检查对象具有数组中的所有属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59872604/

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