当前位置: 首页 > 知识库问答 >
问题:

typescript - 请教TS的泛型条件约束问题?

易焱
2024-01-11

演示代码:https://tsplay.dev/N5jo0m

interface Base {    name: string;    age: number;};interface FixedInstance extends Base {}interface FollowInstance extends Base {}type NameType = "fixed"|"follow";type FixedName = "fixed";type FollowName = "follow";const data: NameType = 'fixed';type myType = typeof data;type isFixed = myType extends FixedName ? true : false;   // truetype isFollow = myType extends FollowName ? true : false;   // false// -----------cut---function sellect<T extends NameType, U = T extends FixedName ? FixedInstance : FollowInstance>(name: T, data: U) {    return {        name, data    };}const { name: myName, data: myData } = sellect("fixed", { name: "levi", age: 18 } as FollowInstance);type dataType = typeof myData;type dataisFixed = myType extends FixedName ? true : false;   // truetype dataisFollow = myType extends FollowName ? true : false;   // false

cut以上,可以看到都是正确的,问题在函数sellect

  • 我需要根据第一个参数name: T去判断第二个参数data的类型
  • 提供的namefixed就限制dataFixedInstance,否则就限制为FollowInstance

问题1:我在sellect参数传参的时候故意 as FollowInstance,在TS中并没有报错
问题2:在拿到的结果中dataisFixedtrue,但是我传过去的是FollowInstance

共有1个答案

鲍高扬
2024-01-11

修改如下

interface Base {    name: string;    age: number;};interface FixedInstance extends Base {}interface FollowInstance extends FixedInstance {    sex: 1|2;}type NameType = "fixed"|"follow";type FixedName = "fixed";type FollowName = "follow";const data: NameType = 'fixed';type myType = typeof data;type isFixed = myType extends FixedName ? true : false;   // truetype isFollow = myType extends FollowName ? true : false;   // false// -----------cut---function sellect<T extends NameType>(name: T, data: T extends FixedName ? FixedInstance : FollowInstance) {    return {        name, data    } as const;}const infodata: FixedInstance = { name: "levi", age: 18 };const { name: myName, data: myData } = sellect("follow", infodata);type dataType = typeof myData;type dataisFixed = myType extends FixedName ? true : false;   // falsetype dataisFollow = myType extends FollowName ? true : false;   // false
 类似资料:
  • 今天面试遇到一道题,想了很久也没有想出来 我是这样写的,但是报错了 f()的参数有问题,想请教一下大家应该如何写?

  • 泛型的类型约束 swapTwoValues(_:_:)函数和Stack类型可以用于任意类型. 但是, 有时在用于泛型函数的类型和泛型类型上, 强制其遵循特定的类型约束很有用. 类型约束指出一个类型形式参数必须继承自特定类, 或者遵循一个特定的协议、组合协议. 例如, Swift的Dictionary类型在可以用于字典中键的类型上设置了一个限制. 如字典中描述的一样,字典键的类型必须是可哈希的. 也

  • 我在typescript中有以下泛型类 但是我不知道为什么得到这个错误Class'(匿名类)'不正确地扩展基类'列'。属性getValue的类型不兼容。类型'(值:数字)=

  • 在过去一周左右的时间里,我一直在为Scala开发一个类型化、索引化的数组特性。我希望将该特征作为类型类提供,并允许库用户以他们喜欢的方式实现它。下面是一个示例,使用列表的列表来实现2D数组类型类: 这一切看起来都很好。我遇到的困难是,我希望将索引类型约束为一个已批准类型的列表(用户可以更改)。由于程序不是所有已批准类型的原始所有者,所以我想用一个typeclass来表示这些已批准类型,并让已批准类

  • 本文向大家介绍TypeScript 类型参数作为约束,包括了TypeScript 类型参数作为约束的使用技巧和注意事项,需要的朋友参考一下 示例 使用TypeScript 1.8,类型参数约束可以从同一类型参数列表中引用类型参数。以前这是一个错误。            

  • 请问下面的 model 参数的类型该如何定义呢? 我试了半天,好像没有办法