使用括号和方括号定义打字稿类型,它们的含义是什么?

时间:2017-12-22 14:44:48

标签: typescript

在Typescript中定义新类型时,哪个角色正在播放方括号和括号? 在下面的示例中,应该是具有typeThree

的变量的数据形状

到目前为止,我玩弄了它并发现了以下内容。

type typeOne = { [id: string] : string; };
type typeTwo = { id : string; };
type typeThree = { (id: string) : string; };

let varOne: typeOne[] = [{id:'', id2:''}]; // OK
let varTwo: typeOne[] = [{idd:''}]; // OK

let varThree: typeTwo[] = [{idd:''}];  // error
let varFour: typeTwo[] = [{id:'', id2:''}]; // error
let varFive: typeTwo[] = [{idd:''}];  // error
let varSix: typeTwo[] = [{id:''}];  // OK
  • typeOne似乎描述了一个地图数组,其键和值是字符串
  • typeTwo似乎描述了一系列地图{id: 'any string'}必须只包含一个名为id
  • 的键
  • typeThree我不知道它在描述什么。

1 个答案:

答案 0 :(得分:2)

虽然您使用的是type关键字,但接口上的文档将适用于您的每个示例。 typeinterface都以相同的方式工作,但您无法使用type作为遗产。

索引器

允许带有任意字符串键的地图。在下面的示例中,键必须是一个字符串(numbers are also allowed,所以从技术上讲它是id: string | number,尽管您不能明确说明)并且值必须是一个字符串(并且只是一个字符串) )。

// Defines an indexer
// The id(or key) must be a string, or number.
// The value must be a string.
type TypeOne = { [id: string]: string; };

const a: TypeOne = {};
a['key'] = 'value';

// Example type violation Type '3' is not assignable to type 'string'
a['key'] = 3;

手册的interface section中描述了索引器。

对象

您问题中的第二种类型是对象结构。它需要一个对象具有命名属性,并具有适当的类型值。使用文字创建类型的实例时,您将获得未知属性(不允许使用)的辅助,这有助于捕捉错误拼写。

type TypeTwo = { id: string; };

const a: TypeTwo = { 
    id: 'value'
} 

// Object literal must only specify known values
const b: TypeTwo = { 
    id: 'value',
    nmae: 'value'
} 

// Type 'number' is not assignable to type 'string'.
const c: TypeTwo = { 
    id: 4
} 

功能

您问题中的第三种类型描述了一个功能。下面的示例,包括示例b的有时神秘的情况,即使它没有id参数也是有效的。关于那个的逻辑是,如果忽略函数体中的参数,为什么要在签名中强制它。调用代码可能会提供它,但无论如何你都没有使用它。

type TypeThree = (id: string) => string;

const a: TypeThree = (id: string) => {
    return id;
};

const b: TypeThree = () => {
    return 'value';
}

// Types of parameters 'id' and 'id' are incompatible.
const c: TypeThree = (id: number) => {
    return 'value';
}

// Type 'number' is not assignable to type 'string'.
const d: TypeThree = (id: string) => {
    return 5;
}

请参阅手册中的function types