如何获取扩展在typescript中的keyof的泛型的键值

时间:2018-06-16 22:12:55

标签: typescript keyof

我试图写一个接受记录类型和记录键的泛型类。一切顺利,直到我必须产生默认值。

export type SortByProps<Record, S extends keyof Record>  = {
    sortByItems: Array<SelectFieldType>
    setSort: (sort: Option<SortParameters<S>>) => void
    sort: Option<SortParameters<S>>
};

type SortByState = {
    currentSort: SelectFieldType
    currentSortDirection: SortDirection
};

export default class SortBy<Record, S extends keyof Record> extends React.PureComponent<SortByProps<Record, S>, SortByState> {

    constructor(props: SortByProps<Record, S>) {
        super(props);
        const {field, direction} = this.props.sort.getOrElseValue(
            {field: 'name', direction: 'ASC'} // Compile error => Type '"name"' is not assignable to type 'S'.
        ); 
        this.state = {
            currentSort: R.find(R.propEq('value', field), this.props.sortByItems),
            currentSortDirection: direction
        };
    }

在代码中,我需要提供默认值,如果道具排序&#39;被设置为“无”#39;但是,sort的field属性需要成为记录的关键。我只想选择第一个键,但我不知道该怎么做。

BTW:我解决了编译错误,但我认为如果能让它工作,另一种方式会更优雅。这是我的解决方法:

constructor(props: SortByProps<Record, S>) {
    super(props);
    this.props.sort.fold(
        () => {
            this.state = {
                currentSort: this.props.sortByItems[0],
                currentSortDirection: 'ASC'
            };

        },
        ({field, direction}) => {
            this.state = {
                currentSort: R.find(R.propEq('value', field), this.props.sortByItems),
                currentSortDirection: direction
            };

        }
    );
}

0 个答案:

没有答案