面试题答案
一键面试额外属性检查基本规则
在TypeScript中,当使用对象字面量赋值给具有特定类型接口的变量时,对象字面量不能有接口中未定义的属性。这是为了防止在对象字面量中意外添加错误的属性。例如:
interface User {
name: string;
age: number;
}
let user: User = {
name: 'John',
age: 30,
// address: '123 Main St' // 报错,address 是额外属性
};
TypeScript会严格检查对象字面量,确保其属性与接口定义完全匹配。
常见场景下额外属性检查的局限性
- 类型断言绕过检查: 使用类型断言可以绕过额外属性检查。例如:
interface User {
name: string;
}
let user: User = {
name: 'Jane',
age: 25
} as User; // 这里使用类型断言绕过了对 age 这个额外属性的检查
- 函数参数展开: 在函数参数使用展开运算符时,额外属性检查可能失效。比如:
interface Options {
width: number;
}
function configure(options: Options) {
// 函数逻辑
}
let config = {
width: 100,
height: 200
};
configure({...config }); // 这里没有对 height 这个额外属性报错,因为展开运算符在这种情况下绕过了额外属性检查
- 索引签名与对象字面量: 当接口定义了索引签名时,额外属性检查会受到影响。例如:
interface StringContainer {
[key: string]: string;
}
let container: StringContainer = {
message: 'Hello',
// 虽然这里没有显式定义 'code' 属性,但由于索引签名允许任意字符串键和字符串值,所以不会报错
code: '123'
};
- 类型兼容性: 当涉及类型兼容性时,如将一个对象赋值给另一个类型,可能会出现额外属性检查的局限性。例如:
interface Base {
a: number;
}
interface Extended extends Base {
b: number;
}
let base: Base = { a: 1 };
let extended: Extended = { a: 1, b: 2, c: 3 };
// 这里给 extended 赋值时,虽然 c 是额外属性,但由于赋值操作是从 Base 类型兼容到 Extended 类型,所以不会报错