[TypeScript] - TypeScript官方文档学习笔记-接口-中上(三)

红太狼 2023-02-22 10:40 83阅读 0赞

接口

方法类型

通过接口可以定义方法参数和返回类型

  1. interface SearchFunc {
  2. (source: string, subString: string): boolean;
  3. }
  4. let mySearch: SearchFunc;
  5. mySearch = function(source: string, subString: string) {
  6. let result = source.search(subString);
  7. return result > -1;
  8. }
  9. console.log(mySearch("sdasdasd",'sd'))

参数名可以不同

返回值类型可以不写

参数类型可以省略,TS会推断值类型是否匹配

省略版

  1. let mySearch: SearchFunc;
  2. mySearch = function(src, sub) {
  3. let result = src.search(sub);
  4. return result > -1;
  5. }

索引类型

接口可以指定索引类型,数字或字符串。索引类型为字符串串时,更像是字典。

数组也是对象,有索引值

  1. interface StringArray {
  2. [index: number]: string;
  3. }
  4. let myArray: StringArray;
  5. myArray = ["Bob", "Fred"];
  6. let myStr: string = myArray[0];

可以同时支持这两种类型的索引器,但从数字索引器返回的类型必须是从字符串索引器返回的类型的一个子类型。这是因为当使用数字进行索引时,JavaScript实际上会在索引成对象之前将其转换为字符串。这意味着用100(数字)做索引和用 “100”(字符串)做索引是一回事,所以两者需要保持一致。

  1. class Animal {
  2. name: string;
  3. }
  4. class Dog extends Animal {
  5. breed: string;
  6. }
  7. // Error: indexing with a numeric string might get you a completely separate type of Animal!
  8. interface NotOkay {
  9. [x: number]: Animal;
  10. [x: string]: Dog;
  11. }
  12. interface Okay {
  13. [x: string]: Animal;
  14. [x: number]: Dog;
  15. }

使用

  1. class Animal {
  2. name: string;
  3. }
  4. class Dog extends Animal {
  5. breed: string;
  6. }
  7. interface Okay {
  8. [x: string]: Animal;
  9. [x: number]: Dog;
  10. }
  11. let dog = new Dog()
  12. dog.name = 'dog啊'
  13. dog.breed = 'what?'
  14. let animal = new Animal()
  15. animal.name = 'Animal啊'
  16. let a: Okay = {'喜':dog,'卡':animal}
  17. //或者a.property形式获取
  18. console.log(a['喜'].name)// dog.breed无法获取,断言获取

虽然字符串索引签名是描述 “字典 “模式的有力方式,但它们也强制要求所有属性与其返回类型相匹配。这是因为字符串索引声明obj.property也可以作为obj["property"]。在下面的例子中,name的类型与字符串索引的类型不匹配,类型检查器给出了一个错误。

  1. interface NumberDictionary {
  2. [index: string]: number;
  3. length: number; // ok, length is a number
  4. name: string; // error, the type of 'name' is not a subtype of the indexer
  5. }
  6. interface NumberOrStringDictionary {
  7. [index: string]: number | string;
  8. length: number; // ok, length is a number
  9. name: string; // ok, name is a string
  10. }

只读

  1. interface ReadonlyStringArray {
  2. readonly [index: number]: string;
  3. }
  4. let myArray: ReadonlyStringArray = ["Alice", "Bob"];
  5. myArray[2] = "Mallory"; // error!

发表评论

表情:
评论列表 (有 0 条评论,83人围观)

还没有评论,来说两句吧...

相关阅读