Typescript 键入防护罩don';不能使用泛型参数?

Typescript 键入防护罩don';不能使用泛型参数?,typescript,typescript-generics,Typescript,Typescript Generics,例如: 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); // her

例如:

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
  }
}
type SomeType={
foo:string;
}|未定义;
函数someFn(params1:SomeType,params2:TParams):void{
如果(参数1){
对象。条目(参数1);
}
如果(参数2){
Object.entries(params2);//这里有一个错误
}
}
TypeScript无法确定
params2
不包含未定义的。有没有一个合乎逻辑的解释,或者这是打字脚本中的一个错误


在线演示

这是typescript()中的一个公开问题。自动类型保护和泛型并不总是一起工作。作为一种可能的解决方法,您可以手动定义此类型的保护:

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);
  }
}
type SomeType={
foo:string;
}|未定义;
函数已定义(v:T):v为排除{
返回v!==未定义
}
函数someFn(params1:SomeType,params2:TParams):void{
如果(参数1){
对象。条目(参数1);
}
如果(已定义(参数2)){
对象。条目(参数2);
}
}

这是一个开放的typescript问题: