首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“一级深”类型缩小--文本中的歧视结合

“一级深”类型缩小--文本中的歧视结合
EN

Stack Overflow用户
提问于 2021-01-26 06:10:21
回答 2查看 336关注 0票数 1

我无法从打字机上得到以下信息:

代码语言:javascript
复制
type Apple = {
  variety: {type: 'fuji'} | {type: 'gala'}
}

type FujiApple = {
  [P in keyof Apple]: P extends 'variety'
    ? Extract<Apple['variety'], {type: 'fuji'}>
    : Apple[P]
}

function fujiFn(fugi: FujiApple) {}

function appleFn(apple: Apple) {
  if (apple.variety.type === 'fuji') {

    // FAILS: Argument of type 'Apple' is not assignable to parameter of type
    // 'FujiApple'
    fujiFn(apple)
  }
}

是否有一种方法可以键入此类型以使缩小范围按预期的方式工作?只有当鉴别器不在顶层时,才会发生这种情况。

我不喜欢的解决方案:

下面的方法确实有效,但是.丑八怪和我宁愿不这么做。

代码语言:javascript
复制
fujiFn({...apple, variety:apple.variety})
EN

回答 2

Stack Overflow用户

发布于 2021-01-26 06:47:55

你可以使用打字机:

代码语言:javascript
复制
function isFujiApple(arg: Apple): arg is FujiApple {
  return arg.variety.type === 'fuji';
}

function appleFn(apple: Apple) {
  if (isFujiApple(apple)) {
    fujiFn(apple); // Now it works
  }
}
票数 1
EN

Stack Overflow用户

发布于 2021-01-26 07:45:29

我认为TS中存在一个问题,因为它无法推断联合的嵌套属性。

以下是解决办法:

代码语言:javascript
复制
type Fuji = { type: 'fuji' }
type Gala = { type: 'gala' }
type Variety = Fuji | Gala

type Apple = {
  variety: Variety
}

type FujiApple = {
  [P in keyof Apple]: P extends 'variety'
  ? Extract<Apple['variety'], { type: 'fuji' }>
  : Apple[P]
}


function fujiFn(fugi: FujiApple) { }


function appleFn(apple: Variety) {
  if (apple.type === 'fuji') {
    fujiFn({ variety: apple }) // ok
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65896633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档