这个问题是使用TypeScript直接类比检查Class类型
我需要在运行时找出类型为any的变量实现接口.这是我的代码:
interface A{
member:string;
}
var a:any={member:"foobar"};
if(a instanceof A) alert(a.member);
Run Code Online (Sandbox Code Playgroud)
如果您在typescript playground中输入此代码,则最后一行将被标记为错误,"当前范围中不存在名称A".但事实并非如此,该名称确实存在于当前范围内.我甚至可以在var a:A={member:"foobar"};没有编辑投诉的情况下将变量声明更改为.浏览网页并在SO上找到另一个问题后,我将界面更改为类,但后来我无法使用对象文字来创建实例.
我想知道A类型是如何消失的,但是看看生成的javascript解释了这个问题:
var a = {
member: "foobar"
};
if(a instanceof A) {
alert(a.member);
}
Run Code Online (Sandbox Code Playgroud)
A没有表示作为接口,因此不可能进行运行时类型检查.
我知道javascript作为一种动态语言没有接口的概念.有没有办法输入接口检查?
打字稿操场的自动完成显示打字稿甚至提供了一种方法implements.我怎么用呢?
有没有办法在Typescript中将字符串解析为JSON.
示例:在JS中,我们可以使用JSON.parse().在Typescript中有类似的功能吗?
我有一个JSON对象字符串,如下所示:
'{"name":"Bob","error":false}'
有什么办法,我如何检测某个对象是否实现了某个接口?
if(myObj implements IMyInterface) {
//... do something
}
Run Code Online (Sandbox Code Playgroud) 我正在使用typescript处理应用程序的UI.与此同时,其他人也在为我提供数据.我们就数据合同达成了一致意见,但是这个过程很容易出错,我不断从服务器获取无效的数据对象.所以我的问题是我可以使用typescript中定义的一些接口以某种方式验证动态对象(在运行时)吗?
这个问题是在2012年提出的,因此它不能重复检查一个对象是否在运行时使用 2015年提出的TypeScript实现了一个接口.
我想知道在使用 TypeScript 时是否有任何工具或技术用于对对象数据进行低级验证。一个示例是 HTTP 服务上的 POST 请求的 JSON 正文。通常,我会为预期数据创建一个接口,然后将数据转换到该接口,但我知道这很肤浅。
例子:
router.route('/supercres')
.get((req, res, next) => {
const typedBody = <SuperCresBody>req.body;
})
interface SuperCresBody {
name: string,
yoyo: boolean,
}
Run Code Online (Sandbox Code Playgroud)
强制执行接口的问题在于 TypeScript 只是一个编译时概念,在运行时不会强制执行任何内容。知道这一点,我很好奇是否有人找到了一种不需要大量样板或工具的聪明方法,以便在运行时完成这些事情的类型检查,而不必将接口契约作为一组命令性检查作为验证步骤来重复。
与此相关的一点是,在最新一集的 Function Geekery中,Matthias Felleisen 在该集末尾附近解释了 Typed Racket 中的类似需求。
相关阅读:
我有一个 Express API 服务器应用程序和一个 React 客户端应用程序,它们都在 TypeScript 中实现。我使用 TypeScript 接口定义了我的数据模型,并且我在系统的两端都使用了这些接口。但是,TypeScript 接口只是编译时功能,我还需要运行时类型检查,例如验证 HTTP POST 数据 (json) 是否符合定义的数据结构。
所以我的问题是,我可以/应该如何利用 TypeScript 提供的功能来实现运行时对象验证?
我想要一个可以是 React 组件或字符串的变量,如下所示:
function MyComponent(): JSX.Element {
let icon: JSX.Element | string = "/example.png"; // (simplified)
return <div>{typeof icon === "JSX.Element" ? icon : <img src={icon} />}</div>;
}
Run Code Online (Sandbox Code Playgroud)
然而 TS 抱怨我的状况说:
TS2367:此条件将始终返回“假”,因为类型“字符串” | “数字”| “bigint”| “布尔值”| “符号”| “未定义” | “对象”| “function”和“JSX.Element”没有重叠。
我应该怎么办?
typescript ×7
javascript ×3
ajax ×1
datacontract ×1
ecmascript-6 ×1
interface ×1
json ×1
reactjs ×1
string ×1
validation ×1
web ×1