下面的语法,
interface StringArray {
[index: number]: string;
}
指出当StringArray
索引为number
,它将返回一个string
。例如 -
let myArray: StringArray;
myArray = ["Bob", "Fred"];
let myStr: string = myArray[0];
So, myArray
存储的值的类型受到限制string
类型,通过用 type 声明它StringArray
。键(索引)始终是string
类型,在引擎盖下(JavaScript),尽管提到它作为number
从下面的语法来看,
class Animal{
name: string;
}
class Dog extends Animal{
breed: string;
}
interface NotOkay {
[x: number]: Animal;
[x: string]: Dog;
}
- 什么是
NotOkay
语法状态?
从下面的语法来看,
interface NumberDictionary {
[index: string]: number;
length: number; // ok, length is a number
name: string; // error, the type of 'name' is not a subtype of the indexer
}
- 什么是
NumberDictionary
state?
- 为什么这两个语法是错误的?
error TS2413
& error: TS2411
(正如 @betadeveloper 指出的,这些示例取自打字稿文档:https://www.typescriptlang.org/docs/handbook/interfaces.html https://www.typescriptlang.org/docs/handbook/interfaces.html)
1+3) 文档的要点是此声明不一致。
该声明似乎表明此代码有效:
let no: NotOkay
function byString(key: string): Dog {
return no[key]
}
function byNumber(key: number): Animal {
return no[key]
}
但问题是,例如查找no[0]
确实是一样的东西no['0']
(这就是 JavaScript 的工作原理)。所以byString('0')
will actually只是结果是动物,不一定是狗。
因此,为了防止上面的代码——看起来正确但实际上对于某些字符串键(那些碰巧是字符串形式的数字的键)来说是错误的——TypeScript 不允许声明。
2+3) [index: string]: number;
表示您可以使用任何字符串作为 a 的索引NumberDictionary
你会得到一个号码。
另一方面,name: string;
说该物业name
是一个字符串。但属性也可以作为索引来访问,例如当做
let nd: NumberDictionary
let a = nd['name']
let b = nd.name
a 和 b 的意思是完全相同的事情,但第一个声明似乎说a
是一个数字,而第二个声明似乎说b
是一个字符串。这是矛盾的,因此这个声明也是不允许的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)