为什么不能在TS中优化对象键?

时间:2019-02-19 23:21:40

标签: typescript

正如标题所述,我似乎无法细化对象上的键,并且想知道我做错了什么。

typescript playground

const x: { key?: number } = {};

if (typeof x.key === 'number') {
    console.log(x.key); // typescript sees `x.key` as `number | undefined` still
}

let y: number | undefined;

if (typeof y === 'number') {
    console.log(y); // typescript sees `y` as `number`
}

2 个答案:

答案 0 :(得分:0)

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

  1. 与javascript中完全相同的功能,用于在运行时给出变量实例化类型的字符串表示形式。
  2. 在类型声明中用于从实例化变量“复制”类型。
  3. 作为type guard,在运行时,TS可以推断条件typeof表达式内的块内的变量类型。目的是让TS编译器知道可用的方法等,并在适当的地方产生错误。

我认为您正在尝试使用typeof实现无法满足的结果。您的示例代码可能需要做一些工作,还不清楚您要执行的操作。

答案 1 :(得分:0)

表达式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