首页 > 解决方案 > 类型保护不适用于通用参数?

问题描述

例子:

type SomeType = {
    foo: string;
} | undefined;

function someFn<TParams extends SomeType>(params1: SomeType, params2: TParams): void {
  if (params1) {
    Object.entries(params1);
  }
  if (params2) {
    Object.entries(params2); // here is an error
  }
}

TypeScript 无法确定params2不包含未定义。对此有合理的解释,还是 TypeScript 中的错误?

在线演示在这里

标签: typescripttypescript-generics

解决方案


这是打字稿中的一个未解决的问题(https://github.com/microsoft/TypeScript/issues/4742)。自动类型保护和泛型并不总是一起工作。作为一种可能的解决方法,您可以手动定义此类型保护:

type SomeType = {
    foo: string;
} | undefined;

function isDefined<T> (v: T): v is Exclude<T, undefined> {
  return v !== undefined
}

function someFn<TParams extends SomeType>(params1: SomeType, params2: TParams): void {
  if (params1) {
    Object.entries(params1);
  }
  if (isDefined(params2)) {
    Object.entries(params2);
  }
}

推荐阅读