TypeScript-如何检查对象是否在编译时实现接口? 问题:

TypeScript-如何检查对象是否在编译时实现接口? 问题:,typescript,interface,Typescript,Interface,假设我有两个文件——一个接口文件(如C中的头文件)和一个实现文件 intf.ts(接口文件): impl.ts(实现文件): 如何确定impl.ts的默认导出是否实现了默认导出intf.ts?假设我不能修改这两个文件中的任何一个 比如: import intf from `./intf.ts`; import impl from `./impl.ts`; if (impl implements intf) console.log("Good input!"); else console

假设我有两个文件——一个接口文件(如C中的头文件)和一个实现文件

intf.ts
(接口文件):

impl.ts
(实现文件):

如何确定
impl.ts
的默认导出是否实现了默认导出
intf.ts
?假设我不能修改这两个文件中的任何一个

比如:

import intf from `./intf.ts`;
import impl from `./impl.ts`;

if (impl implements intf)
  console.log("Good input!");
else
  console.log("Bad input! Input does not implement interface!");
注意:答案不必在typescript中确定


我的部分有效解决方案 以下是我提出的一个部分有效的解决方案:

检查是否实现了.ts

import intf from `./intf.ts`;
import impl from `./impl.ts`;

function check(_: intf) {};
check(impl);
如果实现未实现接口,此脚本将创建编译时错误

然后我可以编译这个脚本并检查是否有错误来确定答案

这有一个问题:如何(在代码中)区分“未实现”错误和任何其他错误


我为什么要这样做? 我正在努力学习clean体系结构,TypeScript由于其静态类型检查而能够很好地与clean体系结构配合使用。例如,依赖项注入在TypeScript中很容易实现

我的计划是每个“模块”(实体、用例、接口实现等)都有一个“接口”和“实现”文件(如问题中所述)

如果模块依赖于其他模块,而不是依赖于名称和版本(如npm中的“^1.0.2””包名),则模块依赖于某个接口。模块可以从现有模块复制接口或创建自己的接口

其思想是,任何实现都可以插入到需要接口实现的模块中。我喜欢称之为“静态依赖项注入”,当然,“运行时依赖项注入”仍然应该在任何有意义的地方使用

因此,现在需要我确定静态注入的实现是否实现了接口



谢谢你的意见

您可以在类型系统中完全检查这一点。您可以使用
import('module')
获取模块的类型并在那里形成表单。如果实现不正确,您可以构建一个将出错的类型:

type Check<T extends import('./intf').default> = T;
type IsOk = Check<typeof import('./impl')['default']>
类型检查=T;
类型IsOk=检查

我想您应该使用TypeScript提供的编译器API编写一个程序,检查实现是否满足接口。@IngoBürk啊,有趣的是,我不知道存在这样的程序。我来看看。谢谢,但这也会产生同样的问题,导致编译时错误,必须以某种方式进行解析,不是吗?@IngoBürk这是真的。。我可能还没有完全理解op想要做的事情。。这是一个构建时解决方案。。不确定如何检测错误,可能在type
type Check=T中添加一个标记因此错误将是
类型“{foo(baz:number):boolean;barr(baz:number):string;}”不满足约束“I|”Implements interf.ts”。
使查找更容易..看起来这可能是最好的解决方案,但我将等待,看看是否还有其他解决方案。谢谢你的邀请help@DavidCallanan当然,不要着急,其他人可能会有更好的想法。如果您在解决方案方面需要任何帮助,请告诉我(不知道:)
import intf from `./intf.ts`;
import impl from `./impl.ts`;

function check(_: intf) {};
check(impl);
type Check<T extends import('./intf').default> = T;
type IsOk = Check<typeof import('./impl')['default']>