我已经在TypeScript游乐场中创建了this example:
interface Test{
a: string
b: string
}
const object: Test = {
a: 'b',
b: 'c',
}
function testIt(): Test[] {
const data = [{b: '2', c: '3'}]
const prices: Test[] = data.length ? data.map((item) => {
return {
a: item.b,
b: item.c,
c: '2',
d: '3'
}
}) : [];
return prices;
}
从数组映射方法的对象返回语句中删除a或b属性会导致TypeScript错误(按预期方式)。
添加c或d或任何其他随机未知属性不会触发TypeScript错误。我怀疑只有在接口包含[x:string]:any的情况下才有可能。
那么,为什么Array.map对接口上缺少的属性进行类型检查,而不对其他/未知属性进行类型检查?
答案 0 :(得分:1)
问题是,根据基本的OOP规则,派生类型(即具有更多属性的类型)应与基本类型(即仅具有<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^/css
RewriteCond %{REQUEST_URI} !^/js
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>
和a
的类型)兼容。
话虽如此,当分配具有更多属性的对象文字时,如果期望类型具有较少属性的类型,typescript确实会警告我们。这称为多余属性检查。此功能仅在对指定类型的对象进行直接分配时起作用。
此多余属性检查不适用于您的情况的原因是对b
进行类型检查的方式。首先,根据对象文字推断出回调返回类型,因此将其推断为map
。然后,此类型用作{ a: string, b: string, c: string, d: string }
的返回类型,因此map
将返回map
。然后,将其分配给Array<{ a: string, b: string, c: string, d: string }>
,在第一条规则下它是允许的。我们没有在任何地方将对象常量分配给期望Test[]
的地方。
发生错误的一种方法是不让打字稿推断出传递给Test
的回调结果。我们可以通过在回调中添加注释来实现。然后,我们直接将对象文字分配给期望map
的位置:
Test