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']);
hasAll({ foo: 'test', bar: 5 }, ['foo', 'bar', 'baz']);
type guard
. 到目前为止,我得到的是:
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> {
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
可分配给
可删除可删除<不可为空<T>,K>
-
我做错了吗?有没有更好的方法来写这种类型的保护?
-