typescript 动态添加属性为什么不匹配扩展后的interface?

interface base {
  hello: string
  [key:string]:any
}
interface baseAdd extends base{
  world: string
}

function test(p: baseAdd) {
  console.log(p);
}

let error: base = {hello:'hello'}
error.world = 'world'
test(error) // 报错
/* Argument of type 'base' is not assignable to parameter of type 'baseAdd'.
  Property 'world' is missing in type 'base' but required in type 'baseAdd'.ts(2345)
a.ts(6, 3): 'world' is declared here.

我觉得可能是-----[key:string]:any的原因,然后请问如何修改才能让ts在动态修改属性后匹配上新的interface?
除了test(error as baseAdd)

阅读 1.8k
1 个回答
let error: base = {hello:'hello'}
error.world = 'world'

即使你这么操作了,error 的类型也还是 base,因为它符合[key:string]:any
你这是要将一个父类变成更具体的子类,据我了解应该只能用断言

但是如果反过来,这样是可以的

interface base {
  hello: string
  [key:string]:any
}
interface baseAdd {
  hello: string
  world: string
  [key:string]:any
}
function test(p: base) {
  console.log(p);
}

let error: baseAdd = {hello: '1', world: '2'}
test(error)
推荐问题
logo
Microsoft
子站问答
访问
宣传栏