2017-06-20 101 views
8

我使用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包装,我需要确保没有传递给服务器的额外或错误的字段。

+0

看起来像是故意的。请参阅[此问题](https://github.com/Microsoft/TypeScript/issues/13444)和[this](https://github.com/Microsoft/TypeScript/issues/3755)以获取更多讨论。 – Saravana

+0

Saravana,是的,我读过这篇文章,但在这些讨论中没有回答我的问题。我认为避免接口的严格性会更好,但将其留给班级。 –

回答

2

你要求的是被称为“exact types”的功能。
它正在被考虑,也就是说,既没有被拒绝也没被接受,讨论仍在继续。

1

这是如何通过设计工作,我不知道你可以解决这个问题。 See the docs欲了解更多信息。

你也做错了什么 - 你不能100%确定发送到服务器的内容。只要浏览器对TS没有任何了解,某些库可以根据需要注入任何需要的请求。通过覆盖XmlHttpRequest方法(这至少是angular的zone.js所做的)。

轻松打破你的意图的另一种方法就像在任何参数前面使用<any>一样简单。

TypeScript旨在改善您的开发过程,但我不认为它可以用于像您这样的需求。这通常通过编写适当的测试来涵盖。

+0

当然我知道TS编译成JS,没有类或类型检查!我需要在开发过程中保护其他开发人员的方法。这一切关于发展。真实案例: https://codepen.io/HarryBurns/pen/LLWoVa.typescript –

1

有“是”的一种方式,但你必须自己实现它。它被称为“用户定义类型卫士”,它看起来像这样:

interface Test { 
    prop: number; 
} 

function isTest(arg: any): arg is Test { 
    return arg && arg.prop && typeof(arg.prop) == 'number'; 
} 
+0

最好使用Reflection(请参阅http://blog.wolksoftware.com/decorators-metadata-reflection-in-typescript-from -novice-to-expert-part-4),所以它会更短,就像'check (myObject)'。或者,就我而言,它是'挑选(myObject)'。像下划线/ lodash'pick'函数一样工作。 –

2

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) 
{} 
相关问题