MST

星途 面试题库

面试题:TypeScript中额外属性检查局限性之基础场景

请描述在TypeScript中,当使用对象字面量赋值给一个具有特定类型接口的变量时,额外属性检查的基本规则,并且举例说明在哪些常见场景下额外属性检查会出现局限性?
34.6万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

额外属性检查基本规则

在TypeScript中,当使用对象字面量赋值给具有特定类型接口的变量时,对象字面量不能有接口中未定义的属性。这是为了防止在对象字面量中意外添加错误的属性。例如:

interface User {
  name: string;
  age: number;
}

let user: User = {
  name: 'John',
  age: 30,
  // address: '123 Main St' // 报错,address 是额外属性
};

TypeScript会严格检查对象字面量,确保其属性与接口定义完全匹配。

常见场景下额外属性检查的局限性

  1. 类型断言绕过检查: 使用类型断言可以绕过额外属性检查。例如:
interface User {
  name: string;
}

let user: User = {
  name: 'Jane',
  age: 25
} as User; // 这里使用类型断言绕过了对 age 这个额外属性的检查
  1. 函数参数展开: 在函数参数使用展开运算符时,额外属性检查可能失效。比如:
interface Options {
  width: number;
}

function configure(options: Options) {
  // 函数逻辑
}

let config = {
  width: 100,
  height: 200
};

configure({...config }); // 这里没有对 height 这个额外属性报错,因为展开运算符在这种情况下绕过了额外属性检查
  1. 索引签名与对象字面量: 当接口定义了索引签名时,额外属性检查会受到影响。例如:
interface StringContainer {
  [key: string]: string;
}

let container: StringContainer = {
  message: 'Hello',
  // 虽然这里没有显式定义 'code' 属性,但由于索引签名允许任意字符串键和字符串值,所以不会报错
  code: '123' 
};
  1. 类型兼容性: 当涉及类型兼容性时,如将一个对象赋值给另一个类型,可能会出现额外属性检查的局限性。例如:
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 类型,所以不会报错