TypeScript基于调用站点的联合类型的窄化类型参数



已识别解

我意识到我只需要利用如下约束

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
}

在上面的上下文中,如果fidoDog类型,则以下操作失败

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

游乐场

相关内容

  • 没有找到相关文章

最新更新