山高为峰 發表於 2020-7-9 22:52:00

TypeScript 对象的类型-接口

<h2>一、什么是接口</h2>
<p>在 TypeScript 中,我们使用接口(Interfaces)来定义对象的类型</p>
<p>接口是一系列抽象方法的声明,是一些方法特征的集合,第三方可以通过这组抽象方法调用,让具体的类执行具体的方法</p>
<p>TypeScript 中接口除了可用于对类的一部分行为进行抽象以外,还可用于对「对象的形状(Shape)」进行描述</p>
<p>举个例子:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> Person {
    name: </span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">;
    age: number;
}

let faker: Person </span>=<span style="color: rgba(0, 0, 0, 1)"> {
    name: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Faker</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
    age: </span><span style="color: rgba(128, 0, 128, 1)">25</span><span style="color: rgba(0, 0, 0, 1)">
};</span></pre>
</div>
<p>这里定义了一个接口 Person,接着定义了一个变量 Faker,它的类型是 Person。这样就约束了 faker 的形状必须和接口 Person 一致</p>
<p><strong>注意:接口一般首字母大写</strong></p>
<p>&nbsp;</p>
<p>定义的变量比接口少了一些属性是不允许的:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> Person {
    name: </span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">;
    age: number;
}

let faker: Person </span>=<span style="color: rgba(0, 0, 0, 1)"> {
    name: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">faker</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
};

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> index.ts(6,5): error TS2322: Type '{ name: string; }' is not assignable to type 'Person'.
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">   Property 'age' is missing in type '{ name: string; }'.</span></pre>
</div>
<p>&nbsp;</p>
<p>多一些属性也是不允许的:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> Person {
    name: </span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">;
    age: number;
}

let faker: Person </span>=<span style="color: rgba(0, 0, 0, 1)"> {
    name: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">faker</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
    age: </span><span style="color: rgba(128, 0, 128, 1)">25</span><span style="color: rgba(0, 0, 0, 1)">,
    gender: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">male</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
};

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> index.ts(9,5): error TS2322: Type '{ name: string; age: number; gender: string; }' is not assignable to type 'Person'.
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">   Object literal may only specify known properties, and 'gender' does not exist in type 'Person'.</span></pre>
</div>
<p>因此赋值时变量的形状必须和接口的形状保持一致</p>
<p>&nbsp;</p>
<h2 id="%E5%8F%AF%E9%80%89%E5%B1%9E%E6%80%A7">二、可选属性<br></h2>
<p>可选属性是指该属性可以不存在,当我们希望不要完全匹配一个形状,可以用可选属性:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> Person {
    name: </span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">;
    age</span>?<span style="color: rgba(0, 0, 0, 1)">: number;
}

let faker: Person </span>=<span style="color: rgba(0, 0, 0, 1)"> {
    name: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Faker</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
};
</span><span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> Person {
    name: </span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">;
    age</span>?<span style="color: rgba(0, 0, 0, 1)">: number;
}

let faker: Person </span>=<span style="color: rgba(0, 0, 0, 1)"> {
    name: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Faker</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
    age: </span><span style="color: rgba(128, 0, 128, 1)">25</span><span style="color: rgba(0, 0, 0, 1)">
};</span></pre>
</div>
<p>&nbsp;</p>
<p>这时仍然不允许添加未定义的属性:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> Person {
    name: </span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">;
    age</span>?<span style="color: rgba(0, 0, 0, 1)">: number;
}

let faker: Person </span>=<span style="color: rgba(0, 0, 0, 1)"> {
    name: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Faker</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
    age: </span><span style="color: rgba(128, 0, 128, 1)">25</span><span style="color: rgba(0, 0, 0, 1)">,
    gender: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">male</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
};

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> examples/playground/index.ts(9,5): error TS2322: Type '{ name: string; age: number; gender: string; }' is not assignable to type 'Person'.
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">   Object literal may only specify known properties, and 'gender' does not exist in type 'Person'.</span></pre>
</div>
<p>&nbsp;</p>
<h2 id="%E4%BB%BB%E6%84%8F%E5%B1%9E%E6%80%A7">三、任意属性<br></h2>
<p>有时候我们希望一个接口允许有任意的属性,可以使用如下方式:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> Person {
    name: </span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">;
    age</span>?<span style="color: rgba(0, 0, 0, 1)">: number;
    : any;
}

let faker: Person </span>=<span style="color: rgba(0, 0, 0, 1)"> {
    name: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Faker</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
    gender: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">male</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
};</span></pre>
</div>
<p>使用 定义了任意属性取 string 类型的值</p>
<p>&nbsp;</p>
<p>需要注意的是,一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它类型的子集:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> Person {
    name: </span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">;
    age</span>?<span style="color: rgba(0, 0, 0, 1)">: number;
    : <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">;
}

let faker: Person </span>=<span style="color: rgba(0, 0, 0, 1)"> {
    name: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Faker</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
    age: </span><span style="color: rgba(128, 0, 128, 1)">25</span><span style="color: rgba(0, 0, 0, 1)">,
    gender: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">male</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
};

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> index.ts(3,5): error TS2411: Property 'age' of type 'number' is not assignable to string index type 'string'.
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> index.ts(7,5): error TS2322: Type '{ : string | number; name: string; age: number; gender: string; }' is not assignable to type 'Person'.
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">   Index signatures are incompatible.
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">   Type 'string | number' is not assignable to type 'string'.
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">       Type 'number' is not assignable to type 'string'.</span></pre>
</div>
<p>上例中,任意属性的值允许是 string,但可选属性 age 的值却是 number,number 不是 string 的子属性,所以报错了</p>
<p><strong>注意:一个接口中只能定义一个任意属性</strong></p>
<p>&nbsp;</p>
<p>如果接口中有多个类型的属性,则可以在任意属性中使用联合类型:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> Person {
    name: </span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">;
    age</span>?<span style="color: rgba(0, 0, 0, 1)">: number;
    : <span style="color: rgba(0, 0, 255, 1)">string</span> |<span style="color: rgba(0, 0, 0, 1)"> number;
}

let faker: Person </span>=<span style="color: rgba(0, 0, 0, 1)"> {
    name: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Faker</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
    age: </span><span style="color: rgba(128, 0, 128, 1)">25</span><span style="color: rgba(0, 0, 0, 1)">,
    gender: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">male</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
};</span></pre>
</div>
<p>&nbsp;</p>
<h2 id="%E5%8F%AA%E8%AF%BB%E5%B1%9E%E6%80%A7">四、只读属性<br></h2>
<p>有时候我们希望对象中的一些字段只能在创建的时候被赋值,那么可以用 readonly 定义只读属性:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> Person {
    </span><span style="color: rgba(0, 0, 255, 1)">readonly</span><span style="color: rgba(0, 0, 0, 1)"> id: number;
    name: </span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">;
    age</span>?<span style="color: rgba(0, 0, 0, 1)">: number;
    : any;
}

let faker: Person </span>=<span style="color: rgba(0, 0, 0, 1)"> {
    id: </span><span style="color: rgba(128, 0, 128, 1)">89757</span><span style="color: rgba(0, 0, 0, 1)">,
    name: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Faker</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
    gender: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">male</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
};

faker.id </span>= <span style="color: rgba(128, 0, 128, 1)">9527</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> index.ts(14,5): error TS2540: Cannot assign to 'id' because it is a constant or a read-only property.</span></pre>
</div>
<p>上例中,使用 readonly 定义的属性 id 初始化后又被赋值,所以报错</p>
<p>&nbsp;</p>
<p>注意,只读的约束存在于第一次给对象赋值的时候,而非第一次给只读属性赋值的时候:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> Person {
    </span><span style="color: rgba(0, 0, 255, 1)">readonly</span><span style="color: rgba(0, 0, 0, 1)"> id: number;
    name: </span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">;
    age</span>?<span style="color: rgba(0, 0, 0, 1)">: number;
    : any;
}

let faker: Person </span>=<span style="color: rgba(0, 0, 0, 1)"> {
    name: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Faker</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
    gender: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">male</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
};

faker.id </span>= <span style="color: rgba(128, 0, 128, 1)">89757</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> index.ts(8,5): error TS2322: Type '{ name: string; gender: string; }' is not assignable to type 'Person'.
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">   Property 'id' is missing in type '{ name: string; gender: string; }'.
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> index.ts(13,5): error TS2540: Cannot assign to 'id' because it is a constant or a read-only property.</span></pre>
</div>
<p>上例中,报错信息有两处:</p>
<p>1、在对 faker 进行赋值的时候,没有给 id 赋值</p>
<p>2、在给 faker.id 赋值的时候,由于它是只读属性,所以报错了</p>
<p>&nbsp;</p>
<h2>五、联合类型和接口</h2>
<p>以下实例演示了如何在接口中使用联合类型:</p>
<div class="example">
<div class="example_code">
<div class="hl-main">
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> Person {
    name:</span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">;
    words:</span><span style="color: rgba(0, 0, 255, 1)">string</span>[]|<span style="color: rgba(0, 0, 255, 1)">string</span>|(()=&gt;<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">);
}

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> words 是字符串</span>
let faker:Person = {name:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Faker</span><span style="color: rgba(128, 0, 0, 1)">"</span>,words:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Hello</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">};
console.log(faker.words)

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> words 是字符串数组</span>
faker = {name:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Faker</span><span style="color: rgba(128, 0, 0, 1)">"</span>,words:[<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Hello</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">World</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]};
console.log(faker.words[</span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">]);
console.log(faker.words[</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">]);

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> words 是一个函数表达式</span>
faker = {name:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Faker</span><span style="color: rgba(128, 0, 0, 1)">"</span>,words:()=&gt;{<span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">**Hello World**</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;}};

let fn:any </span>=<span style="color: rgba(0, 0, 0, 1)"> faker.words;
console.log(fn());</span></pre>
</div>
</div>
</div>
</div>
<p>输出结果为:</p>
<pre class="prettyprint prettyprinted"><span class="typ">Hello<span class="pln">
<span class="typ">Hello<span class="pln">
<span class="typ">World<span class="pln">
<span class="pun">**<span class="typ">Hello<span class="pln"> <span class="typ">World<span class="pun">**<br> <br></span></span></span></span></span></span></span></span></span></span></span></pre>
<h2>六、接口和数组</h2>
<p>接口中我们可以将数组的索引值和元素设置为不同类型,索引值可以是数字或字符串</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> Names {
   :</span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">
}

let list1:Names </span>= [<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Faker</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 128, 1)">1</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Bang</span><span style="color: rgba(128, 0, 0, 1)">"</span>] <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 错误元素 1 不是 string 类型</span>

<span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> Ages {
   :number
}

let list2:Ages;
list2[</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Faker</span><span style="color: rgba(128, 0, 0, 1)">"</span>] = <span style="color: rgba(128, 0, 128, 1)">22</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 正确 </span>
list2[<span style="color: rgba(128, 0, 128, 1)">2</span>] = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ten</span><span style="color: rgba(128, 0, 0, 1)">"</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 错误</span></pre>
</div>
<p>&nbsp;</p>
<h2>七、接口继承</h2>
<p>接口继承就是说接口可以通过其他接口来扩展自己,Typescript 允许接口继承多个接口,继承使用关键字&nbsp;<span class="marked">extends</span></p>
<p><span class="marked">&nbsp;</span></p>
<h3><span class="marked">1、单接口继承</span></h3>
<p>单接口继承语法格式:</p>
<div class="cnblogs_code">
<pre>Child_interface_name extends super_interface_name</pre>
</div>
<p>&nbsp;</p>
<p>示例:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> Person {
   age:number
}

</span><span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> Musician extends Person {
   instrument:</span><span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">
}

let faker </span>= &lt;Musician&gt;<span style="color: rgba(0, 0, 0, 1)">{};
faker.age </span>= <span style="color: rgba(128, 0, 128, 1)">22</span><span style="color: rgba(0, 0, 0, 1)">
faker.instrument </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">piano</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
console.log(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">年龄: </span><span style="color: rgba(128, 0, 0, 1)">"</span> +<span style="color: rgba(0, 0, 0, 1)"> faker.age)
console.log(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">喜欢的乐器: </span><span style="color: rgba(128, 0, 0, 1)">"</span> + faker.instrument)</pre>
</div>
<p>输出:</p>
<p>年龄: 22<br>喜欢的乐器: piano</p>
<p>&nbsp;</p>
<h3><span class="marked">2、多接口继承</span></h3>
<p>多接口继承语法格式:</p>
<div class="cnblogs_code">
<pre class="prettyprint prettyprinted"><span class="typ">Child_interface_name<span class="pln"> <span class="kwd">extends<span class="pln"> super_interface1_name<span class="pun">,<span class="pln"> super_interface2_name<span class="pun">,…,<span class="pln">super_interfaceN_name</span></span></span></span></span></span></span></span></pre>
</div>
<p>&nbsp;</p>
<p>示例:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> IParent1 {
v1:number
}

</span><span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> IParent2 {
v2:number
}

</span><span style="color: rgba(0, 0, 255, 1)">interface</span><span style="color: rgba(0, 0, 0, 1)"> Child extends IParent1, IParent2 { }
let faker:Child </span>= { v1:<span style="color: rgba(128, 0, 128, 1)">22</span>, v2:<span style="color: rgba(128, 0, 128, 1)">23</span><span style="color: rgba(0, 0, 0, 1)">}
console.log(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">value 1: </span><span style="color: rgba(128, 0, 0, 1)">"</span> + faker.v1 + <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)"> value 2: </span><span style="color: rgba(128, 0, 0, 1)">"</span> + faker.v2)</pre>
</div>
<p>输出:</p>
<p>value 1: 22 value 2: 23</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/Leophen/p/13269772.html
頁: [1]
查看完整版本: TypeScript 对象的类型-接口