在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
}
}
}
在上述情况下该怎么办?
答案 0 :(得分:2)
您已经使用的软件:
type Friend = {
name: string;
}
const fred: Friend = {
name: 'Fred',
};
let george: typeof fred;
// Now george is also of type Friend
答案 1 :(得分:1)
您可以创建一个新的type
或interface
并在两种情况下都可以重复使用。
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
}
对于更复杂的类示例,我也会尝试使用type
或interface
:
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
}
}
}
当然,正如@Skovy所说,您还可以将someVar
的类型提取为一个类型,并在两个地方都对其进行引用。 IMO,这是较可取的解决方案,除非您出于某些原因不这样做。
type ComplexType = { complex: 'type' } | undefined;
class Test {
private someVar?: ComplexType;
private someMethod() {
let anotherVar: ComplexType = undefined
if (condition) {
anotherVar = this.someVar
}
}
}