【问题标题】:TypeScript: Property 'propertyName' does not exist on type 'T'TypeScript:类型“T”上不存在属性“propertyName”
【发布时间】:2020-06-23 20:44:18
【问题描述】:

目前我正在学习 TypeScript,但遇到了一个问题:“类型 'T' 上不存在属性'值'

这是我的代码:

type ParseType = <T>(value: T, opts: any, useRounding: boolean) => number;
const parse: ParseType = function(value, opts: any, useRounding): number {
//...
if (isNumber || value instanceof currency) {
  v = (isNumber ? value : value.value) * precision;
}
//...

我将非常感谢您的帮助:)

UPD:我刚刚添加了新接口 interface Currency {value?: number;},使我的泛型类型扩展了它:type ParseType = &lt;T extends Currency&gt;(value: T, opts: any, useRounding: boolean) =&gt; number;,并按照 cmets 中的建议编写了两个单独的条件。

【问题讨论】:

    标签: typescript typescript-typings typescript-generics


    【解决方案1】:

    我猜currency 总是包含一个value 道具? Typescript 无法推断这一点,因为您使用的是两个嵌套的条件语句——理论上可以,但它不够聪明。在内部三元条件下,Typescript 不知道!isNumber 也意味着instanceof currency - 这个连接丢失了。 isNumber 也会发生同样的情况 - 即使您通过检查 value 在某些时候是否是一个数字来得到这个布尔值,如果您在条件的其他地方使用它,这个类型推断属性也不会继续存在。要让 Typescript 推断类型,检查必须在条件中发生。

    试试这个(将嵌套条件扁平化为两个独立的条件):

    if (typeof value === 'number') {
      v = value * precision;
    } else if (value instanceof currency) {
      v = value.value * precision;
    }
    

    一个精简的例子:

    function abc<R>(v: R) {
      if (typeof v === 'number') {
        // Typescript knows v is a number
      }
    
      const isNumber = typeof v === 'number';
      if (isNumber) {
        // Typescript knows nothing about v
      }
    }
    

    【讨论】:

    • 感谢您的帮助! 2个单独的条件是有道理的,你是对的。我就像你写的那样做了,但我仍然收到这个错误。我尝试使用可选链接和 hasOwnProperty 方法,但对我没有帮助
    猜你喜欢
    • 2016-12-19
    • 2023-04-02
    • 2018-08-17
    • 1970-01-01
    • 2023-02-06
    • 2021-08-26
    • 2020-11-07
    • 2019-06-28
    • 1970-01-01
    相关资源
    最近更新 更多