- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的目的是编写一个辅助函数,其目的是根据 key
按字母顺序对对象数组(第一个参数)进行动态排序。作为第二个参数传递。
功能:
interface GenericObject {
[key: string]: string;
}
export const sortAlphabetically = (array: Array<GenericObject>, sortBy: keyof GenericObject) => {
let isKeyValid = false;
// check the key exists in the object before attempting to sort by it
if (array.length > 0) {
isKeyValid = array.every(obj => Object.prototype.hasOwnProperty.call(obj, sortBy) && typeof obj[sortBy] === 'string');
}
if (isKeyValid) {
array.sort((a: GenericObject, b: GenericObject) =>
a[sortBy].toLowerCase() < b[sortBy].toLowerCase()
? -1
: a[sortBy].toLowerCase() > b[sortBy].toLowerCase()
? 1
: 0,
);
return array;
} else {
return;
}
};
所以现在,即使在能够测试我的功能之前,如果我尝试这样做:
export interface Person {
name: string;
surname: string;
}
const people: Person[] = [
{name: 'John', surname: 'Smith'},
{name: 'Tony', surname: 'Denver'},
{name: 'Mary', surname: 'Howard'},
]
sortAlphabetically(people, 'name');
或这个:
export interface Car {
model: string;
make: string;
}
const cars: Car[] = [
{model: 'Golf', make: 'Volkswagen'},
{model: 'X1', make: 'BMW'},
{model: 'Clio', make: 'Renault'},
]
sortAlphabetically(cars, 'make');
我收到错误:
TS2345: Argument of type 'Person[]' is not assignable to parameter of type 'GenericObject[]'. Type 'Person' is not assignable to type 'GenericObject'. Index signature is missing in type 'Person'.
Car[]
也是如此.
any
将在数组内部传递的对象类型,而不提示类型。
GenericObject
的方式上。 .
最佳答案
好吧,首先要说正确的实现会很麻烦。
你寻求什么:
GenericObject
仅键入不足以提供此内容 GenericObject
之间没有关系和 Person
您不能进行此转换的类型:array.sort((a: GenericObject, b: GenericObject)
any
ish 类型然后这将不起作用:a[sortBy].toLowerCase()
因为 .toLowerCase()
必须适用于任何类型的对象属性。GenericObject
interface GenericObject {
[key: string]: string;
}
type FilterFlags<Base, Condition> = {
[Key in keyof Base]:
Base[Key] extends Condition ? Key : never
};
type AllowedNames<Base, Condition> =
FilterFlags<Base, Condition>[keyof Base];
type SubType<Base, Condition> =
Pick<Base, AllowedNames<Base, Condition>>;
export function sort<T>(array: Array<T>, sortBy: keyof SubType<T, string>) {
let isKeyValid = false;
// check the key exists in the object before attempting to sort by it
if (array.length > 0) {
isKeyValid = array.every(obj => Object.prototype.hasOwnProperty.call(obj, sortBy));
}
if (isKeyValid) {
array.sort((a, b) =>
(isGeneric(a, sortBy) && isGeneric(b, sortBy)) ? // narrow down type to GenericObject so that .toLowerCase becomes valid here
a[sortBy].toLowerCase() < b[sortBy].toLowerCase()
? -1
: a[sortBy].toLowerCase() > b[sortBy].toLowerCase()
? 1
: 0 :
1 // this shouldn't be happening
);
return array;
} else {
return;
}
};
const isGeneric = (a: any, key: keyof typeof a): a is GenericObject =>
typeof a[key] === "string";
export interface Person {
id: number;
name: string;
}
const people: Person[] = [
{ name: 'John', id: 1 },
{ name: 'Tony', id: 2 },
{ name: 'Mary', id: 3 },
]
sort(people, "name"); // this won't allow passing "id" as parameter
Playground Link
SubType
类型映射器取自
here
关于typescript - 'InputType[]' 类型的参数不能分配给 'GenericType[]' 类型的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63738033/
以下条件的计算结果为假。应该不是真的吧? editText.getInputType() == InputType.TYPE_NUMBER_FLAG_DECIMAL 特别是在 xml 文件中,我有 a
inputType="text"和在 XML 布局中根本没有 inputType 字段有什么区别?当我完全删除 inputType 时,行为似乎没有什么不同(可能是因为我只是不断更新不可编辑的文本),
我是 android 的初学者,需要您的建议: 1.应用将使用两个单选按钮(短信或电子邮件)发送消息(短信或电子邮件)。 2. 启动时,SMS 单选按钮将被选中并且联系人/接收者的 EditText
我创建了 Custom Edittext,其中我将 InputType 设置为 this.setInputType(InputType.TYPE_CLASS_NUMBER); 但问题是它在低于 7.0
我试图理解 textMultiLine 和editText 中 android:inputType 的 textImeMultiLine 选项。然而我无法理解答案。文档说 IME is a contr
我有一个 ListView ,每行都有一个 EditText。 EditText 应该收集数值,所以我尝试关闭字母键盘并允许用户只看到数字小键盘。 但是,当 ListView 被填充并且我单击列表中的
在我的布局中,我有一个 InputType 为时间的 EditText。 android:inputType="time" 如何将其转换为长? 我有一个函数可以使用 SimpleDateFormat
我有一个 ListView,其中每个项目都有一个复杂的布局,在某些时候包含一个 TextView 和 android:inputType="text" 和 android:ellipsize="mar
我正在尝试让 inputType=phone 始终如一地工作。它在一个项目中完美运行,但我无法让它在任何其他项目中运行。通过“工作”,我的意思是数字没有按照键入的值进行格式化。这是一个不起作用的测试项
我有一个 TextView 对象,其目的是输入一个人的名字。我看了here并看到 textPersonName 是一种输入类型。所以我选择了那个输入类型,认为它会做我想要的。 但是,这种输入类型不将首
我正在使用 jEditable 编辑一些字段。默认情况下,输入字段在单击时会变成文本字段。但我有一个字段应该是日期类型。 jEditable 有可能吗? 类型:'日期'没有帮助 最佳答案 您需要对 j
您可以设置一个 TextView的 inputType到 InputType 中的值之一提示输入的文本应该是一个人的姓名、电话号码等。即使输入法不尊重这个提示,TextView使用 KeyListen
我只需要输入以下字符 0-9 和 _ EditText中的“android:inputType”选择什么? 最佳答案 只需在 XML 中执行此操作 android:digits="0123456789
我已经用高度设计了我的用户名 EditText,我试图将相同的属性复制到我的电子邮件 EditText,当我将 InputType 更改为“textEmailAddress”时,我的自定义高度属性被忽
我的代码: final EditText input = new EditText(VideoRunActivity.this); LinearLayout.LayoutParams
我可以在 XML 中设置 InputType 'time' 我需要一个键盘,它可以显示 digits 和 colon(:)。如何以编程方式设置 InputType“时间”? 最佳答案 对于 time
我有一个带有 android:inputType="number" 的 EditText 并且当我按下数字时不写任何东西(数字)。 EditText 位于对话框 内。 如果我将 number 更改为
我正在编写一个 IME(软键盘),但我从一个应用程序 (Android Mail) 中得到了一些奇怪的行为。它正在向我的 IME 传递一个未知的输入类(通过 InputMethodService.on
我正在尝试使用 custom:inputType="text" custom:inputType="phone" 。帮助我,edit_text 始终设置defvalue。但索引值有问题如果我使用 fo
在我的应用程序中,我有一个 EditText,它带有一个用于更改键盘输入类型的按钮。代码: ToggleCambiarTeclado.setOnClickListener(new OnClickLis
我是一名优秀的程序员,十分优秀!