我有一个接口,需要所有的 prop 。但是,创建对象是一个两步过程。因此,我计划创建对象的2个Partial
版本,然后将它们合并在一起以满足非局部接口。示例:
interface IComplete {
a: string,
b: string
}
const part1: Partial<IComplete> = {
a: 'hello'
}
const part2: Partial<IComplete> = {
b: 'world'
}
const together: IComplete = {
...part1,
...part2
}
即使together
总是完整的,编译器也会抱怨:
Type '{ a?: string; b?: string; }' is not assignable to type 'IComplete'.
Property 'a' is optional in type '{ a?: string; b?: string; }' but required in type 'IComplete'.
Playground
有没有推荐的方法来实现这一点?对于我的例子来说,重要的是接口IComplete
* 不是 * 部分的,即属性a和B永远不会为null或undefined。
3条答案
按热度按时间f0ofjuux1#
@RyanCavanaugh的回答很好。一种让类型推断工作的方法,同时仍然获得编译器的好处,确保
part1
和part2
是Partial<IComplete>
,就是使用如下的helper函数:在上面的例子中,
part1
和part2
都被asPartialIComplete
约束为有效的Partial<IComplete>
对象(因此c
和d
方法的参数分别推断为string
和number
)。但是part1
和part2
的类型足够窄,编译器可以意识到typeof part1 & typeof part2
是IComplete
。希望这也有帮助。祝你好运!
bn31dyow2#
最简单的方法是删除类型注解,让类型推断来完成它的工作:
这确实具有某些有害影响,例如
part1
或part2
中的函数表达式中的参数不会获得推断类型。相反,你可以使用
Pick
--不幸的是,当使用这种方法时,你必须写出你从每种类型中选择的键:cld4siwp3#
坦率地说,我不完全理解为什么typescript transpiler不允许这种语法。
但下面的代码可以绕过它,实现你想要的。