Javascript 可索引类型-类型脚本
下面是语法Javascript 可索引类型-类型脚本,javascript,typescript,duck-typing,Javascript,Typescript,Duck Typing,下面是语法 interface StringArray { [index: number]: string; } class Animal{ name: string; } class Dog extends Animal{ breed: string; } interface NotOkay { [x: number]: Animal; [x: string]: Dog; } interface NumberDictionary { [index:
interface StringArray {
[index: number]: string;
}
class Animal{
name: string;
}
class Dog extends Animal{
breed: string;
}
interface NotOkay {
[x: number]: Animal;
[x: string]: Dog;
}
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
}
声明当StringArray
用编号
索引时,它将返回一个字符串
。比如说-
let myArray: StringArray;
myArray = ["Bob", "Fred"];
let myStr: string = myArray[0];
因此,myArray
通过使用typeStringArray
声明,对存储为string
type的值进行类型约束。键(索引)总是string
type,在引擎盖下(JavaScript),尽管它被称为number
根据下面的语法
interface StringArray {
[index: number]: string;
}
class Animal{
name: string;
}
class Dog extends Animal{
breed: string;
}
interface NotOkay {
[x: number]: Animal;
[x: string]: Dog;
}
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
}
NotOkay
语法状态是什么根据下面的语法
interface StringArray {
[index: number]: string;
}
class Animal{
name: string;
}
class Dog extends Animal{
breed: string;
}
interface NotOkay {
[x: number]: Animal;
[x: string]: Dog;
}
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
说明了什么错误:TS2411
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')
实际上只会产生一只动物,而不一定是一只狗
因此,为了防止上面的代码——对于某些字符串键(那些恰好是字符串形式的数字),这看起来是正确的,但实际上是错误的——TypeScript不允许声明
2+3)[索引:字符串]:数字
表示您可以使用任何字符串作为NumberDictionary
的索引,您将得到一个数字
另一方面,name:string
表示属性名称
是一个字符串。但属性也可以作为索引进行访问,例如在执行以下操作时
let nd: NumberDictionary
let a = nd['name']
let b = nd.name
a和b的意思完全相同,但第一个声明似乎说
a
是一个数字,而第二个声明似乎说b
是一个字符串。这是一个矛盾,因此这个声明也是不允许的。?@betadeveloper我有一个想法,javascript在索引对象之前将其转换为字符串。但是,我没有得到,当文档说,从数值索引器返回的类型必须是从字符串索引器返回的类型的子类型时。首先,我不理解语法,编译器可以根据索引类型和值类型推断有效的操作。对于以数字1为键、以动物为值的NotOkay对象o,当使用字符串“1”查找o时,它将允许访问动物而不是狗。问题是动物中缺少属性“繁殖”,因此o[“1”]。繁殖操作将无效。如果数字索引是Dog的子类型,那么操作就可以了,因为该子类型继承了Dog的繁殖。不过,这种类型检查并不能完全防止运行时错误。即使o中未定义“nil”属性,它也会愉快地编译o[“nil”]。繁殖,并且在尝试访问其繁殖时会导致TypeError。