是否可以将参数强制为某种类型的键?

时间:2017-06-14 08:09:50

标签: typescript

假设我们有以下lodash用法:

type Baz = {
    sortOrder: number
}

const baz: Baz;

_.chain(baz)
    .sortBy("sortOrder")
    .value();

是否可以在不覆盖"sortOrder"类型定义的情况下将keyof Baz限制为.sortBy,还是必须将"sortOrder"提取到变量?

1 个答案:

答案 0 :(得分:1)

根据您的要求:

  

不覆盖.sortBy类型定义

您最好的选择是使用函数包装功能吗?

function sortBy<T, K extends keyof T>(key: K, arr: T[]) {
    return _.chain(arr)
            .sortBy(key)
            .value();
}

允许部分应用sortBy会更好。因此,您可以使用函数sortBy来定义其他函数,例如sortByAgesortByName

const sortBy = <T, K extends keyof T>(key: K) => (arr: T[]) => {
    return _.chain(arr)
            .sortBy(key)
            .value();
}

interface Person {
    name: string;
    age: number;
}

const sortByAge = sortBy<Person, "age">("age");
const sortByName = sortBy<Person, "name">("name");

// Error Type '"namr"' does not satisfy the constraint '"age" | "name"'.
const sortByWrongKey = sortBy<Person, "namr">("namr");


const people: Person[] = [
    { name: "John", age: 30 },
    { name: "Jack", age: 27 }
];

const peopleSortedByAge = sortByAge(people);
const peopleSortedByName = sortByName(people);