我有以下代码:

class Animal {
    name: string;
}
class Dog extends Animal {
    breed: string;
}

// Error: indexing with a 'string' will sometimes get you a Dog!
interface NotOkay {
    [x: number]: Animal;
    [x: string]: Dog;
}

为什么接口“ NotOkay”有错误。 但我尝试更改如下界面:

interface NotOkay {
        [x: string]: Animal;
        [x: number]: Dog;
    }

错误消失。

#1楼 票数:0 已采纳

在JavaScript中(因此在TypeScript中),属性键被强制为string s。 因此,如果您使用number键访问属性,则实际上是在使用string键访问属性:

var obj = {3: 'a', four: 'b'};
console.log(obj['3']); // a
console.log(obj[3]); // a
console.log(obj[3] === obj['3']); // true

但是有些string键也不是number键:

console.log(obj['four']); // b

因此,TypeScript编译器强制要求,用于访问number键的返回值是用于访问string键的返回值的特殊情况。 例如,以下是可以的:

interface Okay {
  [x: string]: Animal;
  [x: number]: Dog;
}

每次您使用number键访问“ Okay时,实际上实际上也在使用string键来访问它。 而且由于每个number键属性都是Dog ,每个string键属性都是Animal ,所以这就是说:每次获得Dog时,实际上也就获得了Animal 这对于编译器是可验证的。 它知道DogAnimal的子类,每只Dog都是Animal 所以TypeScript对Okay感到满意。

但是以下情况并不可行:

interface NotOkay {
  [x: number]: Animal;
  [x: string]: Dog;
}

每次您使用number键访问NotOkay时,实际上您实际上也在使用string键来访问它。 而且由于每个number键属性都是Animal ,每个string键属性都是Dog ,所以这就是说:每次获得Animal ,实际上也就得到了Dog 对于编译器而言,这不是可验证的。 并不是每个Animal都一定是Dog ,所以TypeScript NotOkay 感到不满并抱怨。

希望能有所帮助。

#2楼 票数:0

您不是误解了索引签名吗? 您究竟希望实现什么?

interface Okay {
    name: string
    size: number
    [propName: string]: any
}

这意味着Okay可以具有许多属性,包括Dog和Animal:

// o needs name and size and can have anything else optionally
let o:Okay = {name:'billy', size:2, dog:new Dog(), animal:new Animal()}

  ask by Lulu translate from so

未解决问题?本站智能推荐:

1回复

当构造函数从实现的接口接收不同的参数类型时,Typescript编译器没有错误

我尝试了以下代码: 我期望在尝试向构造函数提供字符(最后一个代码行)时,即使接口(IRectangle)说两个字段都应为数字类型时,打字稿编译器也会给我一个错误。 但是我没有收到任何错误。 为什么这种行为背后的原因是什么?
2回复

typescript类实现签名不正确的接口方法时没有错误

预期得到一个错误,如:类测试错误地实现了接口 Foo 因为函数的签名不正确没有运气。 显示没有任何错误
1回复

即使参数类型错误,TypeScript也声称没有错误

我有一个将字典作为第一个参数的函数。 该字典以字符串为键,以函数为值。 问题是,如果字典中的函数签名错误,TypeScript 不会抱怨! 一段代码值 1000 字。 这是我的main.ts : 我用tsc main.ts编译它,我没有得到任何错误。 tsc --version打印Version
1回复

TypeScript接口实现错误

我很难与以下文件进行协调: 当我尝试对其进行编译时,出现以下错误消息: 很好,这意味着我应该能够通过显式指定属性的对象类型来解决此问题,对吗? 现在问题出在我使用--noImplicitAny编译时,我收到以下错误消息: 似乎无论如何我都会迷失方向,因为如果我对接口上的类型规范保
1回复

如何修复Typescript可订阅接口错误?

我正在尝试将生产 Angular 应用程序从 7 迁移到 8。当我尝试构建时,出现以下错误: 我相信我已经在RXJS 订阅文档中的TypeScript 订阅接口问题主题中找到了问题根源的线索。 但我仍然无法弄清楚如何解决这个问题。 VSCode 显示车辆组件中没有错误。 我认为 ts 文件后面的数
1回复

TypeScript枚举之外的值没有错误

希望这可能会产生编译时错误,但我想我只是误解了枚举的工作方式......
1回复

函数参数的TypeScript类型没有错误?

我正在尝试使用 Typescript 定义必须将哪些参数传递给 React 中的函数: props 散布到组件中: 组件调用函数: 我不明白为什么这不会出错。 foo不存在。 id是一个字符串, amount是一个数字。
2回复

TypeScript对于不匹配的返回值没有错误

为什么TypeScript不抱怨呢? 返回值, categories ,是类型的Array<ProductCategory> ,而不是一个无极,或甚至包装Result类。 那么,为什么让我犯这个错误呢? (有什么办法让它抱怨吗?) 提前致谢