typescript - 函数返回类型不可分配给泛型解析的内容

标签 typescript typescript-generics

下面的TS代码有什么问题?

interface Animal {
  name: string;
}

interface Human {
  firstName: string;
  lastName: string;
}

type HumanName = { humanName: string };
type AnimalName = { animalName: string };

export const getDisplayName = <TItem extends Animal | Human>(
  item: TItem
): TItem extends Human ? HumanName : AnimalName => {
  if ("firstName" in item) {
    return { humanName: `${item.firstName} ${item.lastName}` };  // squiggly line
  } else {
    return { animalName: item.name };  // squiggly line
  }
};

将鼠标悬停在波浪线上,这是我得到的错误:

Type '{ humanName: string; }' is not assignable to type 'TItem extends Human ? HumanName : AnimalName'.ts(2322)

这是 playground link .

片段的灵感来自于传奇人物 Matt Pocock 的 tips .

最佳答案

你的问题是在函数实现中,泛型类型是unresolved,所以你不能把它当作一个Animal或者作为 Human 而无需显式转换。

泛型类型仅为调用者解析。

您的问题的一个可能解决方案是利用 function overloads为了写两个签名:

  • 一个为调用者强类型
  • 一个松散类型的实现(在 duck typing 方面与第一个兼容)
interface Animal {
  name: string;
}

interface Human {
  firstName: string;
  lastName: string;
}

type HumanName = { humanName: string };
type AnimalName = { animalName: string }; 

function getDisplayName<TItem extends Animal | Human>(item: TItem): TItem extends Human ? HumanName : AnimalName
function getDisplayName(item: Animal | Human): HumanName | AnimalName {
  if ("firstName" in item) {
    return { humanName: `${item.firstName} ${item.lastName}` };  // item: Human
  } else {
    return { animalName: item.name };  // item: Animal
  }
}

const animalName = getDisplayName({ name: 'cat' }); // AnimalName
const humanName = getDisplayName({ firstName: 'Guerric', lastName: 'P' }); // HumanName

TypeScript playground

关于typescript - 函数返回类型不可分配给泛型解析的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73586791/

相关文章:

typescript - 如何防止 TypeScript 中的文字类型

typescript - 通过模板文字从字符串构造类型信息

angular - ionic3 获取 http ://localhost:8100/null 404 (Not Found)

typescript - 从类型中删除 undefined

typescript - typescript 中 Record 的通用初始值设定项

typescript-typings - typescript : Evaluate type of generic function

javascript - 在 Angular 中使用源映射生成生产版本 - CLI

Angular2 等待 $http 响应

typescript - tsconfig 选项 "lib"有什么作用?

javascript - 是否有可能禁用 ionic 2 中的按钮?