在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
我不知道它在描述什么。答案 0 :(得分:2)
虽然您使用的是type
关键字,但接口上的文档将适用于您的每个示例。 type
和interface
都以相同的方式工作,但您无法使用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。