繁体   English   中英

打字稿:通过键通用从对象中获取正确的值类型

[英]Typescript: Get correct value type from object by key generic

在示例中,我想编写一个简单的查询构建器,其中所有类型的实体都正确转换。 例如,当我使用 equalsTo 过滤名称时,我只想允许字符串作为值,对于年龄来说,应该只允许数字。 现在 value 可以是 Dogs 的任何值,这不是我想要的。 有人可以帮助我这可能吗?

class Dogs {
    name!: string;
    age!: number;
    alive!: boolean;
}
interface QueryBuilder<O extends object, F extends keyof O = keyof O> {
    equalsTo: (fieldName: F, value: O[F]) => boolean;
}
const queryBuilder = <O extends object>(): QueryBuilder<O> => ({
    equalsTo: (fieldName, value) => true 
})
const qb = queryBuilder<Dogs>();
qb.equalsTo("name", 1); // Should throw an error that only string is allowed as value
qb.equalsTo("age", "Rex"); // Should throw an error that only number is allowed as value

您的接口定义:

interface QueryBuilder<O extends object, F extends keyof O = keyof O> {
    equalsTo: (fieldName: F, value: O[F]) => boolean;
}

允许equalsTo的第二个参数为string | number | boolean string | number | boolean string | number | boolean ,因为 TypeScript 无法在级别进一步缩小类型。

但是- 如果您对函数本身进行类型注释:

interface QueryBuilder<O extends object> {
    equalsTo: <F extends keyof O = keyof O>(fieldName: F, value: O[F]) => boolean;
}

...你得到你正在寻找的行为:

qb.equalsTo("name", 1); // Argument of type 'number' is not assignable to parameter of type 'string'.(2345)

qb.equalsTo("age", "Rex"); // Argument of type 'string' is not assignable to parameter of type 'number'.(2345)


TypeScript 游乐场

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM