如果我有一些类似这样的代码:
type Bravo = {
b?: string;
}
type Charlie = {
c:Bravo['b']
}
function acceptsCharlie(value: Charlie){
//'value.c' is possibly 'undefined'.(18048)
value.c.split('');
}
这是有道理的——该类型Charlie
从继承了可选字符串Bravo
。
我们可以通过使用Required
实用程序类型来解决这个问题:
type Bravo = {
b?: string;
}
type Charlie = {
// 👇
c:Required<Bravo>['b']
}
function acceptsCharlie(value: Charlie){
// no error here
value.c.split('');
}
简单的。
但是,如果我再添加一层键入查找:
type Alpha = {
a?: string;
}
type Bravo = {
b: Alpha['a'];
}
type Charlie = {
c: Required<Bravo>['b']
}
function acceptsCharlie(value: Charlie){
//'value.c' is possibly 'undefined'.(18048)
value.c.split('');
}
这Required
不再能解决我的问题。
怎么回事?
?
和之间的区别| undefined
在于,在第一种情况下,该字段可以被跳过,而在第二种情况下,该字段需要存在,即使它可以undefined
作为值。Required
仅适用于可选字段。如果字段类型为field : X | undefined
,则“必需”将对其不起作用。操场
而当它被输入为 时
field? : X
,则Required
有效:操场
您使用间接方式进行的操作是,现在
Bravo
肯定存在该字段b
,它可能是未定义的或字符串,但它不是可选的。因此,在这种情况下,Required 的作用不大。TS 2.8 发行说明摘录:
使两者都成为必需的
b: Required<Alpha>['a'];
。在这里尝试过,你可以在这里玩一下 typescriptlang