TypeScript严格的类/接口
我使用TypeScript版本2.3.4。我想编写一个接受必须具有指定字段的对象的函数。但是这个对象不应该包含任何其他字段。我怎样才能做到这一点?TypeScript严格的类/接口
现在这只适用于我定义对象内联。但是,如果我使用额外字段的另一个对象 - 编译器将允许它。什么是完全错误的。
实施例:
function foo(arg: { a: string }) { // there is tons of fields actually
// ...
}
foo ({a: "qwerty"}); // No Error - ok
foo ({a: "qwerty", b: 123}); // Error - ok
let bar = {
a: "qwerty",
b: 123
};
foo (bar); // No Error - NOT OK !!!
相同的代码可与接口,类类型声明来所著 - 这是同样的问题。
现在我必须手动从对象中提取字段,以确保没有额外的字段。但是我不能在整个代码中将这个解决方案传播给1000个函数(我真的需要这个) - 这太乱了。我创建API包装,我需要确保没有传递给服务器的额外或错误的字段。
这是如何通过设计工作,我不知道你可以解决这个问题。 See the docs欲了解更多信息。
你也做错了什么 - 你不能100%确定发送到服务器的内容。只要浏览器对TS没有任何了解,某些库可以根据需要注入任何需要的请求。通过覆盖XmlHttpRequest方法(这至少是angular的zone.js所做的)。
轻松打破你的意图的另一种方法就像在任何参数前面使用<any>
一样简单。
TypeScript旨在改善您的开发过程,但我不认为它可以用于像您这样的需求。这通常通过编写适当的测试来涵盖。
当然我知道TS编译成JS,没有类或类型检查!我需要在开发过程中保护其他开发人员的方法。这一切关于发展。真实案例: https://codepen.io/HarryBurns/pen/LLWoVa.typescript –
有“是”的一种方式,但你必须自己实现它。它被称为“用户定义类型卫士”,它看起来像这样:
interface Test {
prop: number;
}
function isTest(arg: any): arg is Test {
return arg && arg.prop && typeof(arg.prop) == 'number';
}
最好使用Reflection(请参阅http://blog.wolksoftware.com/decorators-metadata-reflection-in-typescript-from -novice-to-expert-part-4),所以它会更短,就像'check
Necromancing。
type foo = {
a:string;
b:number;
opt?:string;
}
function test(obj:foo)
{}
test({ a:"", b:123, e:"produceError"});
以及强制它是一个对象,如果所有的参数都是可选的:
它与打字稿2.4即将
function test(obj:foo & object)
{}
如果你想传递一个字符串或其他对象的类型:
function test(obj: string | foo & object)
{}
看起来像是故意的。请参阅[此问题](https://github.com/Microsoft/TypeScript/issues/13444)和[this](https://github.com/Microsoft/TypeScript/issues/3755)以获取更多讨论。 – Saravana
Saravana,是的,我读过这篇文章,但在这些讨论中没有回答我的问题。我认为避免接口的严格性会更好,但将其留给班级。 –