如何在打字稿中强制使用类型实例而不是 typeof

如何解决如何在打字稿中强制使用类型实例而不是 typeof

如何通过将 type 强制为一个实例来导出它。

我尝试了很多方法,我只找到了一个解决方案,即创建一个静态 getter,但我想删除我的静态 getter。

这里的上下文: 我想从 $A.A 中导出 A 实例的类型,仅供参考。


export const $A = (() => {
    class A {
        static get default() {
            return A.create();
        }
        static create() {
            return new A();
        }
        constructor() {}
    }

    return { A };
})();

我尝试了很多方法,这里有 7 个!没有人以 1 的方式工作!但这是因为我在 js 类中添加了一个静态 getter。

export type _1 = typeof $A.A.default;
export type _2 = typeof new $A.A;
export type _3 = typeof $A.A.create();
export type _4 = typeof  $A.A();
export type _5 = typeof $A['A'];
export type _6 =  $A.A;
export type _7 = typeof new ()=>$A.A;

// example somewhere in the project,i want tell A should be a instance and not a typeof!
function foo(A:_6)

那么在 ts 类型中模拟实例以导出某处仅用于 typage 使用的语法是什么。 我的项目是在 js 中,但使用 ts 只是为了帮助 tsserver 在他不了解我的 refs 时理解他。

  • 所以它仅用于我的 ide 中的 Intelisence,而不用于生成 ts=>js。

enter image description here

解决方法

初步说明:此处的 class A 代码缺少任何实例结构(没有属性或方法)。所有非空值都可以分配给该实例类型;有关详细信息,请参阅 this FAQ entry。为了避免这种奇怪的现象,我在示例类中添加了一个属性:

const $A = (() => {
    class A {
        static get default() {
            return A.create();
        }
        static create() {
            return new A();
        }
        constructor() { }
        someStructure = 123; // add structure here
    }

    return { A };
})();

现在编译器可以判断 {someRandomThing: 123} 与您在命名时遇到问题的 A 类型不兼容。


您可能想使用 the InstanceType<T> utility type 来提取构造签名的返回类型:

type A = InstanceType<typeof $A.A>

您可以使用 conditional type inference 自己编写:

type AlsoA = typeof $A.A extends new (...args: any) => infer I ? I : never;

或者,您可以使用我们在条件类型存在之前必须使用的方法:TypeScript 假装类的 prototype 属性与其实例类型相同。这不是真的,因为原型通常只包含方法而不是其他属性。但无论如何你都可以使用它:

type AlsoAlsoA = typeof $A.A.prototype;

其中任何一个都应该产生相同的类型。


让我们确保它有效:

function foo(a: A) { }

foo($A.A.create()) // okay
foo({ someRandomThing: 123 }) // error 
// Argument of type '{ someRandomThing: number; }' is 
// not assignable to parameter of type 'A'.

看起来不错!

Playground link to code

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?