TypeScript:可索引类型,string []不可分配

时间:2017-01-27 07:19:26

标签: typescript

TypeScriptIndexable type让我们可以描述我们可以索引的类型。例如可以像这样定义一个字符串数组:

interface StringArray { 
  [key: number]: string;
}

let x: StringArray = ['Sheldon', 'Cooper'];
x[0] = 'John';
x[1] = 'Snow';

通过查看我理解的索引签名[key: number]: string;,它定义了键/索引的名称:key以及键的类型:string和类型返回的值是number。现在,当我将键的类型更改为字符串时,我收到错误。

interface MyStringArray { 
  [key: string]: string;
}

//Type 'string[]' is not assignable to type 'MyStringArray'.
//Index signature is missing in type 'string[]'. 
var y: MyStringArray = ['Sheldon', 'Cooper']; //<- causes the error
y[0] = 'John';
y[1] = 'Snow'; 

当我将密钥的类型更改为string时,我无法理解为什么它会显示警告。当key的类型为numeric时,为什么不会发生这种情况。是因为数组导致数组索引是数字的吗?

当我们同时拥有索引类型和其他属性时会发生什么

示例1:它显示索引器类型错误

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 :当我将[index:string]的类型更改为[index: number]

时,它不显示错误
interface NumberDictionary {
    [index: number]: number;
    length: number;    // ok, length is a number
    name: string;      // after chaning `index` type to number it's does'nt show error
}

2 个答案:

答案 0 :(得分:3)

语法[key: number]: string将数字键和值定义为字符串(以其他方式描述)。字符串数组由数字索引,因此可以用这样的结构来描述。

关于你的接口再考虑一下:

interface NumberDictionary {
    [index: number]: number;
    prop: string;    // ok, irrelevant to indexer as prop is not a number
    '1': string;      // error - must return number
}

只有符合key要求的属性才能根据索引返回类型进行验证。这是有道理的,因为您无法使用prop语法访问[]

答案 1 :(得分:0)

是。这是因为string []使用数字索引。如果要将索引用作字符串,则需要更改类似下面的代码。

interface StringArray {
    [index: string]: string;
}

let myArray: StringArray;
myArray["1"] = "Bob";
myArray["2"]="Fred";

let myStr: string = myArray[0];

当我们同时拥有索引类型和其他属性时会发生什么。

好吧,根据Documentation

  

支持的索引签名有两种类型:字符串和数字。

因此,示例1是字符串索引签名类型,因此它们强制执行所有属性以匹配其返回类型。

  

虽然字符串索引签名是一种强大的描述方式   “字典”模式,他们还强制所有属性匹配   他们的回报类型。这是因为字符串索引声明了这一点   obj.property也可以作为obj [“property”]。

当您在示例2中将其更改为数字时,它将 NumberDictionary 更改为数字索引签名,因此它将允许属性具有任何返回类型。