Typescript 为什么我不能在TS中优化对象关键点?

Typescript 为什么我不能在TS中优化对象关键点?,typescript,Typescript,正如标题所说,我似乎无法优化对象上的键,我想知道我做错了什么 const x:{key?:number}={}; 如果(x.key的类型=='number'){ console.log(x.key);//typescript仍然将'x.key'视为'number |未定义' } 设y:数|未定义; 如果(y的类型=='number'){ console.log(y);//typescript将'y'视为'number` } 我不太确定您在这里想要实现什么,但是typeof在TypeScript

正如标题所说,我似乎无法优化对象上的键,我想知道我做错了什么

const x:{key?:number}={};
如果(x.key的类型=='number'){
console.log(x.key);//typescript仍然将'x.key'视为'number |未定义'
}
设y:数|未定义;
如果(y的类型=='number'){
console.log(y);//typescript将'y'视为'number`
}

我不太确定您在这里想要实现什么,但是
typeof
在TypeScript中扮演三个角色(谢谢@MikeHill)

  • 与javascript中的函数完全相同,在运行时用于为实例化类型的变量提供字符串表示
  • 在类型声明中用于从实例化变量“复制”类型
  • 作为一个例子,TS可以在运行时推断条件typeof表达式中块内的变量类型。其目的是让TS编译器知道可用的方法等,并在适当的情况下产生错误

  • 我认为您试图使用typeof来实现它无法满足的结果。您的示例代码可能需要一些工作,您所追求的行为非常不清楚。

    我不太确定您在这里想要实现什么,但是
    typeof
    在TypeScript中扮演三个角色(谢谢@MikeHill)

  • 与javascript中的函数完全相同,在运行时用于为实例化类型的变量提供字符串表示
  • 在类型声明中用于从实例化变量“复制”类型
  • 作为一个例子,TS可以在运行时推断条件typeof表达式中块内的变量类型。其目的是让TS编译器知道可用的方法等,并在适当的情况下产生错误

  • 我认为您试图使用typeof来实现它无法满足的结果。您的示例代码可能需要一些工作,您所追求的行为非常不清楚。

    expression x.key可能会有副作用,因此编译器无法保证类型

    class X {
      private firstTime = true; 
      get key(): number | undefined { 
        if (this.firstTime) { 
          this.firstTime = false;
          return 1;
        }
        return  undefined;
      }
    }
    
    const x: { key?: number } = new X();
    
    console.log(typeof x.key); // number
    console.log(typeof x.key); // undefined
    

    表达式x.key可能有副作用,因此编译器无法保证类型

    class X {
      private firstTime = true; 
      get key(): number | undefined { 
        if (this.firstTime) { 
          this.firstTime = false;
          return 1;
        }
        return  undefined;
      }
    }
    
    const x: { key?: number } = new X();
    
    console.log(typeof x.key); // number
    console.log(typeof x.key); // undefined
    


    我没有得到和你一样的结果。在本地运行3.3.1时,x.key和y都会“未定义”,除非我给变量赋值。“typescript将
    x.key
    视为
    number |未定义”
    仍然”-您确定吗?这里(ts v3.3.3)和操场上都是
    number
    。操场上的代码没有抱怨,即没有警告。您运行此操作的typescript版本是什么?TS在这里应该可以正常工作。为了更清楚地了解TS看到了什么,您可以尝试通过将
    x.key
    设置为一个新变量来推断
    const z=x.key推断
    常数z:number
    。此中间变量在最终代码中不应该是必需的。请参阅启用了
    strictNullChecks
    的示例,以查看TS是否按预期工作并防止误用:我没有得到与您相同的结果。在本地运行3.3.1时,x.key和y都会“未定义”,除非我给变量赋值。“typescript将
    x.key
    视为
    number |未定义”
    仍然”-您确定吗?这里(ts v3.3.3)和操场上都是
    number
    。操场上的代码没有抱怨,即没有警告。您运行此操作的typescript版本是什么?TS在这里应该可以正常工作。为了更清楚地了解TS看到了什么,您可以尝试通过将
    x.key
    设置为一个新变量来推断
    const z=x.key推断
    常数z:number
    。这个中间变量在您的最终代码中不应该是必需的。请参阅启用了
    strictNullChecks
    以查看TS是否按预期工作并防止误用的示例:我相信问题是关于类型,而不是运行时值。运行时使用typeof是非常误导的,在类型声明中使用typeof是完全不同的事情。他试图在运行时根据事物的外观按类型进行细化。
    number
    是内置的JS类型,条件是可接受的鉴别器,在编译时由TS(as)解释,在运行时由JS解释。他正确地使用了
    typeof
    ,但似乎误解了他的工具。@MikeHill,你对这个问题的评论是对的。TypeScript正确地细化了这些块中的类型
    const blah=x.key
    根据类型保护的指示,将
    number
    作为推断类型。很明显,这个问题还有更多的期待。我相信这个问题是关于类型的,而不是关于运行时值的。运行时使用typeof是非常误导的,在类型声明中使用typeof是完全不同的事情。他试图在运行时根据事物的外观按类型进行细化。
    number
    是内置的JS类型,条件是可接受的鉴别器,在编译时由TS(as)解释,在运行时由JS解释。他正确地使用了
    typeof
    ,但似乎误解了他的工具。@MikeHill,你对这个问题的评论是对的。TypeScript正确地细化了这些块中的类型
    const blah=x.key
    根据类型保护的指示,将
    number
    作为推断类型。很明显,从这个问题来看,人们期待着更多的东西。