我无法从打字机上得到以下信息:
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)
}
}是否有一种方法可以键入此类型以使缩小范围按预期的方式工作?只有当鉴别器不在顶层时,才会发生这种情况。
我不喜欢的解决方案:
下面的方法确实有效,但是.丑八怪和我宁愿不这么做。
fujiFn({...apple, variety:apple.variety})发布于 2021-01-26 06:47:55
你可以使用打字机:
function isFujiApple(arg: Apple): arg is FujiApple {
return arg.variety.type === 'fuji';
}
function appleFn(apple: Apple) {
if (isFujiApple(apple)) {
fujiFn(apple); // Now it works
}
}发布于 2021-01-26 07:45:29
我认为TS中存在一个问题,因为它无法推断联合的嵌套属性。
以下是解决办法:
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
}
}https://stackoverflow.com/questions/65896633
复制相似问题