2017-11-25 206 views
1

下面的语法,指出当StringArraynumber索引,它会返回一个string。例如 - let myArray: StringArray;myArray = ["Bob", "Fred"];let myStr: string = myArray[0];可转位型 -</p> <pre><code>interface StringArray { [index: number]: string; } </code></pre> <p>打字稿

所以,myArray的类型为限制于存储为string类型值,通过与StringArray类型声明它。键(索引)总是string型,引擎盖(JavaScript的)下,尽管提它作为number


从下面的语法,

class Animal{ 
    name: string; 
} 

class Dog extends Animal{ 
    breed: string; 
} 

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

1)什么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 
} 

2)什么NumberDictionary状态?


3)为什么这两种语法都错了? error TS2413 & error: TS2411

+0

?https:// www。typescriptlang.org/docs/handbook/interfaces.html – 2017-11-25 15:22:25

+0

@betadeveloper我有一个想法,JavaScript在索引它之前将索引对象转换为字符串。但是,当文档说明时,我没有得到,*从数字索引器返回的类型必须是从字符串索引器*返回的类型的子类型。首先,我不明白语法 – overexchange

+0

编译器可以根据索引的类型和值的类型推断有效的操作。在_NotOkay_对象_o_的情况下,其数字1作为键和动物作为它的值,当用字符串“1”查找_o_时,它将访问动物而不是狗。问题是动物中缺少属性_breed_ so _o [“1”]。breed_将是一个无效操作。如果_number_索引是_Dog_的子类型,那么该操作就可以,因为子类型继承_Dog_中的_breed_。 – 2017-11-25 20:52:43

回答

1

(如@betadeveloper指出的那样,实施例从打字稿文档在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')实际上只是导致动物,不一定是狗。

因此,为了防止上面的代码 - 看起来是正确的,但事实上某些字符串键是错误的(恰巧是字符串形式的数字) - TypeScript不允许声明。

2 + 3)[index: string]: number;表示您可以使用任何字符串作为NumberDictionary的索引,您将得到一个数字。

另一方面,name: string;说属性name是一个字符串。但是一个属性也可以作为索引来访问,例如做

let nd: NumberDictionary 

let a = nd['name'] 
let b = nd.name 

当A和B是指完全一样的东西,但是第一个声明似乎在说:a是一个数字,而第二个声明似乎说b是一个字符串。这是一个矛盾,因此这个声明也是不允许的。

相关问题