index signatures && Call signatures

84 阅读1分钟

先从一个问题入手:

问题:

interface FilesIndex {
  [index: string]: number;
}  

interface FilesCall {
  (param: string): string;
}

这两个接口类型有什么不同吗?怎么去使用?
index signatures

有些时候我们不知道类型属性,但是我们知道值的形状,我们可以使用index签名去定义这种数据类型 , 此数据类型一般为对象

<!--index为number 值为string类型-->
interface StringArray {
  [index: number]: string;
}
 
const myArray: StringArray = getStringArray();
const secondItem = myArray[1];

举例:
interface NumberDictionary {
  [index: string]: number;
 
  length: number; // ok
  name: string; // error
  NumberDictionary类型的值的类型都是bumber 而不是 string
}

修改:
interface NumberOrStringDictionary {
  [index: string]: number | string;
  length: number; // ok, length is a number
  name: string; // ok, name is a string
}


index signature 的index属性还可以用只读表示


Call signatures

在函数中有一些属性是可以被调用的,然而函数表达式语法确无法容许声明辞属性 如果我们想使用此属性 可以使用呼叫签名

type DescribableFunction = {
  description: string;
  (someArg: number): boolean;
};
function doSomething(fn: DescribableFunction) {
  console.log(fn.description + " returned " + fn(6));
}

注意语法:该类型定义了一个函数,参数类型为number,返回值是boolean


const myFun = (someArg: number) => {
    return someArg > 5
}

<!--这个函数需要具有descript属性-->
myFun.description = 'checks the arg is greater than 5'

doSomething(myFun)

结论:

interface FilesIndex {
  [index: string]: number;
}  

interface FilesCall {
  (param: string): string;
  address: string// 我们还可以为函数新增address属性
}

1.FilesIndex 是index签名, 我们可以定义一些属性类型为stering 且值为number的数据接口
2.FilesCall 是函数的呼叫签名 该类型定义了一个函数,参数类型为string,返回值是string

使用:

let filesObj : FilesIndex = {'name': 1,'age': 2, 'sez': 3}

filesObj['address'] = 4 // 新增属性

<!--打印结果:-->
 {
  "name": 1,
  "age": 2,
  "sez": 3,
  "address": 4
}


let files : FilesCall = Object.assign(function (param: string) { return param },{address: 'six street'})


function doSomething(fn: FilesCall) {
  console.log(fn('param Name') + " live in  " + fn.address);
}

<!--"param Name live in  six street" -->

要去注意每一个小细节!!!