我正在努力了解打字稿所提供的类型安全性的程度。我遇到了一种情况,我希望会出现错误,但是类型记录不会抱怨。
我定义了一个函数,它的参数与某个接口相匹配。然后我用一些不匹配的参数调用函数。这是代码(或在操场上 )
interface ArgumentInterface {
[key: number]: string
}
interface InvalidArgumentInterface {
[key: string]: number
}
interface InvalidArgumentInterface2 {
foo: number
}
function myFunction(arg: ArgumentInterface) {
// function body
}
let validArgument: ArgumentInterface = {};
validArgument[5] = 'I am a string';
let invalidArgument: InvalidArgumentInterface = {
foo: 42
};
let invalidArgument2: {foo: number} = {
foo: 42
};
let invalidArgument3: InvalidArgumentInterface2 = {
foo: 42
};
let invalidArgument4 = {
foo: 42
};
myFunction(validArgument); // no typescript error, as expected
myFunction(invalidArgument); // typescript error, as expected
myFunction(invalidArgument2); // no typescript error!
myFunction(invalidArgument3); // typescript error, as expected
myFunction(invalidArgument4); // no typescript error!当我的参数变量显式声明一个不兼容的接口时,我会得到一个预期的类型记录错误。但是,当我的参数变量声明类型为文字(没有接口)或声明根本没有类型时,类型记录一点也不抱怨,尽管我希望会出现错误。
我将"noImplicitAny“标志设置为true。
有人能解释一下这种行为吗?
发布于 2017-01-31 11:48:10
你不会因为以下原因而出错:
myFunction(invalidArgument2);
myFunction(invalidArgument4);因为它们的类型是{ foo: number; },而且与ArgumentInterface的定义并不矛盾,所以值可以两者兼而有之:
let a = {
1: "one",
2: "two",
foo: 4
}在这里,用数字索引的内容有一个字符串值,但是foo索引有一个数字值。
如果ArgumentInterface是:
interface ArgumentInterface {
[key: number]: string;
[key: string]: string;
}然后你就得到了你所期望的错误。
发布于 2017-01-31 11:31:50
这是因为TypeScript使用结构类型 (像Ocaml)。
invalidArgument2和invalidArgument4在结构上都与ArgumentInterface兼容,因此,TypeScript乐于接受它们。
https://stackoverflow.com/questions/41956347
复制相似问题