以下代码中self
局部变量的哪种类型正确?
class SuperHyperMegaExtraVeryPrettyLongClassName {
static exampleProperty1: number = 1;
static exampleProperty2: string = 'asdf';
private someMethod(): void {
// invalid type
const self: SuperHyperMegaExtraVeryPrettyLongClassName = SuperHyperMegaExtraVeryPrettyLongClassName;
console.log(self.exampleProperty1, self.exampleProperty2);
}
}
答案 0 :(得分:1)
Typescript类型系统是 duck-typing ,这意味着self
变量的正确类型可能表明您打算如何使用它。在这种情况下,它必须具有您引用的两个属性。
class SuperHyperMegaExtraVeryPrettyLongClassName {
static exampleProperty1: number = 1;
static exampleProperty2: string = 'asdf';
private someMethod(): void {
const self: {exampleProperty1: number,exampleProperty2: string} = SuperHyperMegaExtraVeryPrettyLongClassName;
console.log(self.exampleProperty1, self.exampleProperty2);
}
}
让我知道这是否对您有用!
答案 1 :(得分:1)
当您想要 class 的类型而不是 instance 的类型时,可以使用typeof
作为类型查询:
class X {
static y: number = 1;
static z: string = 'hi';
private someMethod(): void {
const Class: typeof X = X;
console.log(Class.y, Class.z);
}
}
您现在不能以一般的方式安全地执行此操作(有关详细信息,请参见Microsoft/TypeScript#3841),但是您可以解决以下所有消费者对typeof Y
的需求Y
,如果该类具有实例类型的实例属性:
type Class<T> = T extends Object ? T['constructor'] : never;
class Y {
'constructor': typeof Y; // Quotes are important
}
type XClass = Class<X>; // Function
type YClass = Class<Y>; // typeof Y;