Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何优化typescript中对象的属性值?_Typescript - Fatal编程技术网

如何优化typescript中对象的属性值?

如何优化typescript中对象的属性值?,typescript,Typescript,有没有办法细化对象上的属性 declare const a: { x?: number }; if (a.x) { doSomething(a); // how do I refine `a.x` here to `number`? } 我意识到了原因,并且知道我可以将a.x分配给常量,但我想传递整个a对象,并告诉TS a.x可能不再是未定义的您可以使用a来实现这一点: declare const a: { x?: number }; if (hasX(a)) { doSo

有没有办法细化对象上的属性

declare const a: {
  x?: number
};

if (a.x) {
  doSomething(a); // how do I refine `a.x` here to `number`?
}
我意识到了原因,并且知道我可以将a.x分配给常量,但我想传递整个a对象,并告诉TS a.x可能不再是未定义的

您可以使用a来实现这一点:

declare const a: {
  x?: number
};

if (hasX(a)) {
  doSomething(a); // a is of type { x: number } here
}

function hasX(a: { x?: number }): a is { x: number } {
  return !!a.x;
}
为此,您可以使用一个:

declare const a: {
  x?: number
};

if (hasX(a)) {
  doSomething(a); // a is of type { x: number } here
}

function hasX(a: { x?: number }): a is { x: number } {
  return !!a.x;
}
部分类型 最简单的方法是使用。它允许您将现有类型映射到具有所有标记为可选属性的类似类型

然后,当您调用doSomething时,告诉typescript现在可以将a作为一个完整的项目进行转换

接口项{ x:号码 } 常数a:Partial={}; 如果a.x{ doSomethinga作为项目; } 函数doSomethingitem:项{/*…*/} 这将告诉typescript将a作为部分项引用

使用带局部保护的类型保护 如果您想避免最后的强制转换,并使用typescript机制来确定a是完整类型,那么可以使用a。这样,您就不需要告诉typescript将一个项目视为一个项目

接口项{ x:号码 } 常数a:Partial={}; 如果我是茶{ 多索美辛加; } 函数doSomethingitem:项{/*…*/} 函数isItemCompleteitem:Partial:项为项{ return!!item.x;//部分类型 最简单的方法是使用。它允许您将现有类型映射到具有所有标记为可选属性的类似类型

然后,当您调用doSomething时,告诉typescript现在可以将a作为一个完整的项目进行转换

接口项{ x:号码 } 常数a:Partial={}; 如果a.x{ doSomethinga作为项目; } 函数doSomethingitem:项{/*…*/} 这将告诉typescript将a作为部分项引用

使用带局部保护的类型保护 如果你想避免最后的强制转换,并使用typescript机制知道a是完整类型,你可以使用a。这样,你就不需要告诉typescript将a视为项目

接口项{ x:号码 } 常数a:Partial={}; 如果我是茶{ 多索美辛加; } 函数doSomethingitem:项{/*…*/} 函数isItemCompleteitem:Partial:项为项{
return!!item.x;//对于一般解决方案,这里对@AlekseyL.的建议做了一些调整:

function has<T extends {}, K extends keyof T>(a: T, k: K): a is T & { [k in K]-?: T[K] } {
  return typeof a[k] !== "undefined";
}

declare const a: {
  x?: number
};

if (has(a, "x")) {
  doSomething(a);
}
更一般的™ 解决方案:

function has<T extends object, K extends keyof T>(
  obj: T,
  ...props: K[]
): obj is T & { [k in K]-?: NonNullable<T[K]> } {
  for (const prop in props) {
    if (obj[prop] === null || obj[prop] === undefined) return false;
  }

  return true;
}

对于一般的解决方案,这里对@AlekseyL.的建议做了一点调整:

function has<T extends {}, K extends keyof T>(a: T, k: K): a is T & { [k in K]-?: T[K] } {
  return typeof a[k] !== "undefined";
}

declare const a: {
  x?: number
};

if (has(a, "x")) {
  doSomething(a);
}
更一般的™ 解决方案:

function has<T extends object, K extends keyof T>(
  obj: T,
  ...props: K[]
): obj is T & { [k in K]-?: NonNullable<T[K]> } {
  for (const prop in props) {
    if (obj[prop] === null || obj[prop] === undefined) return false;
  }

  return true;
}

很好的解释副本;@AlekseyL.我的答案的第二部分?我实际上是从中复制的。它恰好相似:-很好的解释副本;@AlekseyL.我的答案的第二部分?我实际上是从中复制的。它恰好相似:-相关的Github问题…属性上的类型保护通常不会缩小父/祖父的范围租金/祖先对象,可能与Github问题有关…属性上的类型卫士通常不会缩小父/祖父母/祖先对象的范围,可能要感谢,他们会使用这个,并稍微调整添加不可为null的对象,实际上也会调整多一点。同样,它只允许检查任何数量的道具是否为null |未定义抱歉,h注释中的orrid间距:导出函数hasProps obj:T,…props:K[]:obj是T&{[K in K]-?:不可空}{对于props中的常量prop{如果obj[prop]==null | | obj[prop]==undefined return false;}return true;}谢谢,我会用这个来做一些小的调整,增加不可为null的值,实际上也会做一些调整。同样的,它只允许检查任意数量的道具是否为null |未定义的。对不起,注释中的间距太大了:export function hasProps obj:T,…props:K[]:obj是T&{[K in K]-?:NonNullable}{for const props in props{if obj[prop]==null | | obj[prop]==undefined返回false;}返回true;}