已识别解
我意识到我只需要利用如下约束
function nameAnimal<Type extends { name: string }>(animal: Type, name: string): Type {
animal.name = name
return animal
}
虽然这可能是不够的,如果一个人真的希望它仅限于Animal
类型,它肯定是足够的用例。
我想说的是无论你调用这个函数的联合类型A是什么类型,它都会返回相同的具体类型
例如,在以下上下文中:
type Animal = Dog | Cat
type Dog = {
name: string
...
}
type Cat = {
name: string
...
}
function nameAnimal(animal: Animal, name: string): Animal {
animal.name = name
return animal
}
function handleDog(dog: Dog) {
// dog specific code
}
在上面的上下文中,如果fido
为Dog
类型,则以下操作失败
handleDog(nameAnimal(fido, 'Fido'))
因为nameAnimal
返回Animal
而不是Dog
。
是否有一种方法可以让nameAnimal
指定它返回与它接收的相同的具体类型?在Java中,类似的概念可以通过泛型实现,如下所示
public static <T extends Animal> T nameAnimal(T animal, String name) {
animal.name = name
return animal
}
再次,我理解这是非常不同的,因为它涉及到类层次结构和继承。我可以想象这是对联合类型的固有限制。
标题>你只需要使用通用参数:
type Animal = Dog | Cat
type Dog = {
name: string
tag: 'Dog'
}
type Cat = {
name: string
tag: 'Cat'
}
function nameAnimal<A extends Animal>(animal: A, name: string): A {
animal.name = name
return animal
}
const fido: Dog = {
name: 'Tom',
tag: 'Dog'
}
function handleDog(dog: Dog) {
// dog specific code
}
handleDog(nameAnimal(fido, 'Fido')) // ok
游乐场