先从一个问题入手:
问题:
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" -->
要去注意每一个小细节!!!