Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 可索引类型-类型脚本_Javascript_Typescript_Duck Typing - Fatal编程技术网

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
通过使用type
StringArray
声明,对存储为
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
    说明了什么

  • 为什么这两种语法是错误的<代码>错误TS2413和
    错误:TS2411
  • (正如@betadeveloper所指出的,示例取自以下位置的typescript文档)

    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)
    [索引:字符串]:数字
    表示您可以使用任何字符串作为
    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。