我已经开始学习打字稿。我确定可能会有与此类似的罚单,但希望对此有个快速的了解。
private void SetClickListener() {
for (int i=0;i<arrayView.length;i++)
if (arrayView[i] != null)
arrayView[i].setOnClickListener(this);
}
@IBOutlet weak var segmentSection: UISegmentedControl!
segmentSection.selectedSegmentIndex = 0
但是我收到此错误i have keys
type keys = 'a' | 'e' | 'i' | 'o' | 'u';
I want these to restrict the possible a keys in an object
所以我尝试了
{
numbers : number;
symbols : string;
[key : keys] : string | number | boolean;
}
但是我从TSLint获得了An index signature parameter type cannot be a union type. Consider using a mapped object type instead.
。
我希望有人可以举例说明它们为什么以及如何变化,以帮助我解决这些问题。和解决方案。
我想要的结果是
{
numbers : number;
symbols : string;
[key in keys] : string | number | boolean;
}
答案 0 :(得分:0)
Mapped types与index signatures类似,但它们并不相同。如您所见,索引签名的密钥只能完全是string
或number
。映射类型允许您指定一组较窄的键,但是不能将其他属性添加到映射类型。
您可以执行的操作是使用intersection:
type X = {numbers: number; symbols: string} & {[K in keys]: string | number | boolean}
// type X = {
// numbers: number;
// symbols: string;
// } & {
// a: string | number | boolean;
// e: string | number | boolean;
// i: string | number | boolean;
// o: string | number | boolean;
// u: string | number | boolean;
// }
这基本上与您想要的相同,因为交集A & B
意味着您必须同时遵守A
和B
。
表示这种类型的另一种方法是对整个对象使用映射的conditional类型,而不是交集。对于您来说,这看起来会更复杂,但可以为人们使用提供更好的评价:
type Y = { [K in "numbers" | "symbols" | keys]:
K extends "numbers" ? number :
K extends "symbols" ? string :
string | number | boolean };
// type Y = {
// a: string | number | boolean;
// e: string | number | boolean;
// i: string | number | boolean;
// o: string | number | boolean;
// u: string | number | boolean;
// numbers: number;
// symbols: string;
无论哪种方法都可以。希望能有所帮助;祝你好运!
答案 1 :(得分:0)
type keys = 'a' | 'e' | 'i' | 'o' | 'u'
type Dynamic = {
[index in keys]: string | number | boolean
}&{
numbers : number;
symbols : string;
}