在打字稿中,如何从基本接口的并集转换为扩展接口的并集
In typescript, how to convert from union of base interfaces to union of extended interfaces
我对打字稿还很陌生,一直在努力思考如何正确使用联合类型。我正在开发一个应用程序,它将从一个 api 接收一组基础结构,然后使用来自另一个 apis/state 的数据来扩充它们。基本接口集和增强接口都可以是强类型的,所以我想利用它。
我想完成的事情:
- 作为一组基接口的联合的强类型基类型
- 强类型'decorated'类型为装饰接口集的联合
- 它们之间的转换方法
错误发生在转换步骤,因为 typescript 似乎不知道用于装饰的函数遵循接口中定义的规则。我在下面整理了一个最小的示例案例:
type PetKind = 'dog' | 'cat'
interface BasePetInterface {
kind: PetKind
name: string
}
interface BaseDog extends BasePetInterface {
kind: 'dog'
}
interface BaseCat extends BasePetInterface {
kind: 'cat'
}
type BasePet = BaseDog | BaseCat
function getFluffy(p: BasePet): boolean {
if (p.kind === 'dog') return true
if (p.kind === 'cat') return false
}
interface FluffyDog extends BaseDog {
fluffy: true
}
interface NotFluffyCat extends BaseCat {
fluffy: false
}
type Pet = FluffyDog | NotFluffyCat
function getPet(p: BasePet): Pet {
return {
...p,
fluffy: getFluffy(p)
}
/* error here ->
severity: 'Error'
message: 'Type '{ fluffy: boolean; kind: "dog"; name: string; }
| { fluffy: boolean; kind: "cat"; name: string; }' is not
assignable to type 'Pet'.
Type '{ fluffy: boolean; kind: "dog"; name: string; }' is not
assignable to type 'Pet'.
Type '{ fluffy: boolean; kind: "dog"; name: string; }' is not
assignable to type 'NotFluffyCat'.
Types of property 'fluffy' are incompatible.
Type 'boolean' is not assignable to type 'false'.'
}
上面的 'fluffy' 是人为设计的 - 在实际的应用程序中,这些变量可能取决于其他状态。对于某些完整类型,它们可能是预先确定的,而对于其他类型,它们可能是有条件的。
有办法处理吗?或者是否有更好的模式来处理相关基础接口和装饰接口的集合?
Type 'boolean' is not assignable to type 'false'.'
这只是打字稿,用于确定并非 BasePet
+ boolean
的所有组合都匹配您的(受限)Pet
。
如果所有组合都有效 Pet
s 你就不会得到错误。
总结
你所做的是有效的:
type True = true;
type False = false;
type Bool = true | false;
declare let x: Bool;
declare let y: False;
y = x; // Error: same error as you are getting
我对打字稿还很陌生,一直在努力思考如何正确使用联合类型。我正在开发一个应用程序,它将从一个 api 接收一组基础结构,然后使用来自另一个 apis/state 的数据来扩充它们。基本接口集和增强接口都可以是强类型的,所以我想利用它。
我想完成的事情:
- 作为一组基接口的联合的强类型基类型
- 强类型'decorated'类型为装饰接口集的联合
- 它们之间的转换方法
错误发生在转换步骤,因为 typescript 似乎不知道用于装饰的函数遵循接口中定义的规则。我在下面整理了一个最小的示例案例:
type PetKind = 'dog' | 'cat'
interface BasePetInterface {
kind: PetKind
name: string
}
interface BaseDog extends BasePetInterface {
kind: 'dog'
}
interface BaseCat extends BasePetInterface {
kind: 'cat'
}
type BasePet = BaseDog | BaseCat
function getFluffy(p: BasePet): boolean {
if (p.kind === 'dog') return true
if (p.kind === 'cat') return false
}
interface FluffyDog extends BaseDog {
fluffy: true
}
interface NotFluffyCat extends BaseCat {
fluffy: false
}
type Pet = FluffyDog | NotFluffyCat
function getPet(p: BasePet): Pet {
return {
...p,
fluffy: getFluffy(p)
}
/* error here ->
severity: 'Error'
message: 'Type '{ fluffy: boolean; kind: "dog"; name: string; }
| { fluffy: boolean; kind: "cat"; name: string; }' is not
assignable to type 'Pet'.
Type '{ fluffy: boolean; kind: "dog"; name: string; }' is not
assignable to type 'Pet'.
Type '{ fluffy: boolean; kind: "dog"; name: string; }' is not
assignable to type 'NotFluffyCat'.
Types of property 'fluffy' are incompatible.
Type 'boolean' is not assignable to type 'false'.'
}
上面的 'fluffy' 是人为设计的 - 在实际的应用程序中,这些变量可能取决于其他状态。对于某些完整类型,它们可能是预先确定的,而对于其他类型,它们可能是有条件的。
有办法处理吗?或者是否有更好的模式来处理相关基础接口和装饰接口的集合?
Type 'boolean' is not assignable to type 'false'.'
这只是打字稿,用于确定并非 BasePet
+ boolean
的所有组合都匹配您的(受限)Pet
。
如果所有组合都有效 Pet
s 你就不会得到错误。
总结
你所做的是有效的:
type True = true;
type False = false;
type Bool = true | false;
declare let x: Bool;
declare let y: False;
y = x; // Error: same error as you are getting