[英]typescript: Array of templated interface extending multiple types
这是我的问题的最小示例
interface Dog {
legs: number;
}
interface Person {
arms: number;
}
type Living = Person | Dog;
interface Speaker<T extends Living> {
speak: (living: T) => void;
};
const michel: Speaker<Person> = { speak: (person) => console.log(`I have ${person.arms} arms`) };
const speakers: Array<Speaker<Living>> = [michel];
它抛出这个错误
Type 'Speaker<Person>' is not assignable to type 'Speaker<Living>'.
Type 'Living' is not assignable to type 'Person'.
Property 'harms' is missing in type 'Dog' but required in type 'Person'
我想要一个可以接受任何类型Living
的Speaker
数组。
谢谢你的时间!
根据您定义事物的方式, Speaker<Living>
表示一个具有说话功能的对象,该对象接收Person | Dog
Person | Dog
作为它的论点。 当你创建michel
,你有以下功能,如果给定一个Person
,它可以正常工作:
(person) => console.log(`I have ${person.arms} arms`)
但是如果给定一个Person | Dog
就行不通了 Person | Dog
,因为它试图访问狗的.arms
属性。 这种不匹配和其他不匹配就是为什么打字稿告诉你Speaker<Person>
不能分配给Speaker<Living>
如果您希望数组是对象的混合,其中一些将Person
作为其发言功能,其中一些采用Dog
,那么其类型将是:
const speakers: Array<Speaker<Person> | Speaker<Dog>> = [michel];
编辑:如果您的Living
union 很大,或者您希望在将更多类型添加到Living
时自动更新扬声器,那么您可以使用以下内容获取打字稿以生成Speaker<Person> | Speaker<Dog>
Speaker<Person> | Speaker<Dog>
工会给你:
type Distribute<T> = T extends Living ? Speaker<T> : never;
const speakers: Array<Distribute<Living>> = [michel];
// speakers is of type Array<Speaker<Person> | Speaker<Dog>>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.