我使用TypeScript版本2.3.4。我想编写一个接受必须具有指定字段的对象的函数。但是此对象不应包含任何其他字段。我怎样才能做到这一点?
现在只有在我定义对象内联时才有效。但是,如果我使用另一个带有额外字段的对象 - 编译器将允许它。什么是完全错误的。
示例:
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 :(得分:3)
您要求的功能称为“exact types”。
它被考虑,即既不被拒绝也不被接受,讨论仍在继续。
答案 1 :(得分:1)
这是它的设计工作方式,我不确定你能解决这个问题。 See the docs了解更多信息。
你也做错了 - 你无法100%确定发送到服务器的内容。只要浏览器不知道有关TS的任何信息,某些库就可以注入任何需要的任何请求,例如:通过覆盖XmlHttpRequest方法(这是至少有角度的zone.js)。
轻松打破你的意图的另一种方法就像在你传递的任何参数前使用<any>
一样简单。
TypeScript旨在改善您的开发过程,但我认为它不能用于满足您的需求。通常通过编写适当的测试来解决这个问题。
答案 2 :(得分:1)
“有”方法,但你必须自己实施。它被称为“用户定义的类型保护”,它看起来像这样:
interface Test {
prop: number;
}
function isTest(arg: any): arg is Test {
return arg && arg.prop && typeof(arg.prop) == 'number';
}
答案 3 :(得分:1)
Necromancing。
这是打字稿2.4:
type foo = {
a:string;
b:number;
opt?:string;
}
function test(obj:foo)
{}
test({ a:"", b:123, e:"produceError"});
如果所有参数都是可选的,那么强制它是一个对象:
function test(obj:foo & object)
{}
如果你想传递一个字符串或另一个对象类型:
function test(obj: string | foo & object)
{}
答案 4 :(得分:1)
使用条件类型可以检查两种类型是否相互扩展 - 类型的相等性检查。下面是一个可能的解决方案:
df = pd.read_csv(csvFilePath, sep='\t', skiprows=5)