使用 Faker 获取和设置以下所有数据的性别

Using Faker to get and set gender for all following data

我正在将 Faker 与 TypeScript 一起使用,并且正在努力弄清楚如何以一种我可以在后续调用中使用的方式从 Faker 捕获返回的性别。这就是我想要做的:

const gender = faker.name.gender(true);  // <-- returns a string
const firstName = faker.name.firstName(gender);  
const middleName = faker.name.middleName(gender);  

不幸的是,Faker 的 faker.name.firstName(gender) 采用 GenderType 枚举值,而不是字符串,即使你可以像 faker.name.firstName('male') 那样使用它。这行得通,但使用变量 gender 不起作用。

我是不是漏掉了什么?

faker.name.firstName 具有类型 (gender?: GenderType) => string,其中 type GenderType = 'female' | 'male' | 0 | 1;*.

但是,faker.name.gender 的类型是 (binary?: boolean = false) => string。它可以 return 相当广泛的值范围:

> faker.name.gender()
'T* woman'
> faker.name.gender()
'Intersex'
> faker.name.gender()
'Cis'

毫无帮助,即使你将 binary 设置为 true,它 returns 是 "Female""Male",两者实际上都不是GenderType:

> faker.name.gender(true)
'Male'
> faker.name.gender(true)
'Female'

尽管有一些规范化,所以这在 JavaScript 中有效(但 不适用于 TypeScript):

> faker.name.firstName("Male")
'Ilene'

要完成这项工作,您必须添加一些 type assertions,例如:

import { faker, GenderType } from "@faker-js/faker";
const gender = faker.name.gender(true).toLowerCase() as GenderType;
                                                  // ^ we know this will be true
const name = faker.name.firstName(gender);

或者,如果您想使用大写版本,请使用 intrinisic string manipulation types:

const gender = faker.name.gender(true) as "Female" | "Male";
                                    // ^ we know this will be true

// ...

const name = faker.name.firstName(gender.toLowerCase() as Lowercase<typeof gender>);
                                                    // ^ this is obviously true
                                                    //   (if ugly...)

这些看起来很尴尬,我已经打开 a bug 来探索它是否可以在上游修复。

(另外,在 TypeScript 中字符串的大小写类型似乎是 being explored,因此可能在某些时候不需要 as Lowercase。)


* 数值已弃用:

> faker.name.firstName(0)
[@faker-js/faker]: name.firstName(number) is deprecated since v6.1.0 and will be removed in v7.0.0. Please use 'female' or 'male' instead.
'Forrest'