typescript 这个find<S extends T>这行是什么作用

image.png

find<s extends T>这行是什么作用,意思是子类也可以使用find函数吗?有没有应用场景,可以举一下例子,方便理解,谢谢大佬们

阅读 1.9k
3 个回答

只是重载啊,意思是规定了新的泛型S是基于T类型的扩展。
一种是4个参数的find,一种是3个参数的find,分别定义了两个方式下参数类型和返回值的类型。

比方说有这么两个类型:

interface Animal {
    name: string
}

interface Dog extends Animal {
    bark(): void
} 

然后现在你有一个Animal数组, 你想要从里面找到一个Dog返回

function isDog(dog: Animal): dog is Dog {
  return (dog as Dog).bark !== undefined
}

declare const animals: Array<Animal>;

// 这个返回的就是dog了
const dog: Dog = animals.find(isDog);

主要是数组中的元素没法限定类型统一,就可能出现有的元素是A类型,有的元素是B类型,那么查询结果可能是个联合类型,对于后续的处理可能不太方便。因此find通常需要指定泛型来表达查询到的结果应该是S类型。因此<S extends T>其实就是表达查到的元素类型依然是数组中存在的类型。有个小例子不知道表达的准不准确

interface A {
    name: string
}

interface B {
    age: number
}



let arr: Array<A|B> = [{name: 'jack'}]

arr.push({ age: 17})

function testA(value: A|B): value is A {
    return 'name' in value && value.name === 'jack'
}
 
let findA = arr.find<A>(testA)

function test(value: A|B): value is B {
    return 'age' in value && value.age > 10
}

let findB = arr.find<B>(test)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题