另一个类型定义中的引用变量的类型

时间:2019-09-03 17:06:53

标签: typescript

在TypeScript中是否可以在另一个变量(someVar)的类型声明中引用一个变量的类型(在本示例中为anotherVar)?

比方说,我不想为{ complex: 'type' }创建新的类型声明,只需将其作为someVar的类型插入。然后,在以后的代码中,我想有条件地将anotherVal设置为someVar的值,否则将其保持未定义状态。我不想使用any作为其类型,但与someVar相同。

const someVar?: { complex: 'type' } // = ...

// ...

// What I would like in pseudocode:
let anotherVar/*: (typeof someVar) */ = undefined

if (condition) {
  anotherVar = someVar
}


编辑:TypeScript似乎有一个typeof运算符(并且上面的伪代码也是有效的TypeScript代码),但是它并不是在所有情况下都能很好地工作,尤其是在this下。

一个稍有不同的示例:

class Test {
  private someVar?: { complex: 'type' } // = ...

  private someMethod() {
    let anotherVar: typeof this.someVar = undefined // Error: Cannot find name 'this'.

    if (condition) {
      anotherVar = someVar
    }
  }
}

在上述情况下该怎么办?

3 个答案:

答案 0 :(得分:2)

您已经使用的软件:

type Friend = {
    name: string;
}

const fred: Friend = {
    name: 'Fred',
};

let george: typeof fred;
// Now george is also of type Friend

答案 1 :(得分:1)

您可以创建一个新的typeinterface并在两种情况下都可以重复使用。

type A = undefined | { complex: 'type' }

const someVar: A = { complex: 'type'};

let anotherVar: A = undefined

let condition = true;
if (condition) {
  anotherVar = someVar
}

您也可以像建议的那样使用typeof运算符:

let someVar: { complex: 'type' } | undefined;

let anotherVar: typeof someVar = undefined

let condition = true;
if (condition) {
  anotherVar = someVar
}

对于更复杂的类示例,我也会尝试使用typeinterface

type A = { complex: 'type' } | undefined;

class Test {
  private someVar?: A;

  private someMethod() {
    let anotherVar: A = undefined

    let condition = true;
    if (condition) {
      anotherVar = this.someVar
    }
  }
}

我还没有看到这种方法,但是它似乎也可以工作:

class Test {
  private someVar?: { complex: 'type' }

  private someMethod() {
    let anotherVar: typeof Test.prototype.someVar = undefined

    let condition = true;
    if (condition) {
      anotherVar = this.someVar
    }
  }
}

答案 2 :(得分:1)

很遗憾,keyof运算符不适用于this。曾经有一个proposal about this on Github,但是它已经关闭,很可能无法实现。我认为最好的替代方法是从这样的类中查找成员的类型:

class Test {
  private someVar?: { complex: 'type' } // = ...

  private someMethod() {
    let anotherVar: Test["someVar"] = undefined

    if (condition) {
      anotherVar = someVar
    }
  }
}

Playground


当然,正如@Skovy所说,您还可以将someVar的类型提取为一个类型,并在两个地方都对其进行引用。 IMO,这是较可取的解决方案,除非您出于某些原因不这样做。

type ComplexType = { complex: 'type' } | undefined;

class Test {
  private someVar?: ComplexType;

  private someMethod() {
    let anotherVar: ComplexType = undefined

    if (condition) {
      anotherVar = this.someVar
    }
  }
}