Когда использовать ограничение типа в Typescript? - PullRequest
0 голосов
/ 23 февраля 2020

В соответствии с машинописным текстом do c: Использование параметров типа в Generi c Ограничения , код с использованием ограничения generi c выглядит следующим образом:

function getProperty<T, K extends keyof T>(obj: T, key: K) {
    return obj[key];
}

let x = { a: 1, b: 2, c: 3, d: 4 };

getProperty(x, "a"); // okay
getProperty(x, "m"); // error: Argument of type 'm' isn't assignable to 'a' | 'b' | 'c' | 'd'.

Однако если я попытаюсь:

function getProperty<T>(obj: T, key: keyof T) {
    return obj[key];
}

let x = { a: 1, b: 2, c: 3, d: 4 };

getProperty(x, "a"); // okay
getProperty(x, "m"); // error: Argument of type 'm' isn't assignable to 'a' | 'b' | 'c' | 'd'.

Это работает нормально, и я не вижу никакой причины, почему бы здесь не использовать ограничение типа.

Так, когда я должен использовать ограничение типа? Специально для ключевого слова extends здесь.

Ответы [ 2 ]

3 голосов
/ 23 февраля 2020

С помощью ограничения типа (первый подход) машинопись сможет вывести «неширокый» тип ключа. Таким образом, key будет иметь тип "a", а не "a" | "b" | "c" | "d".

Если это поведение является желательным или нет, зависит от конкретного c случая, но, похоже, ваш пример мог бы извлечь из этого пользу - функция сможет правильно разрешать тип свойства:

function getProperty<T, K extends keyof T>(obj: T, key: K) {
    return obj[key];
}

function getProperty2<T>(obj: T, key: keyof T) {
    return obj[key];
}

const x = { a: 1, b: '2', c: true };

const v = getProperty(x, "a"); // v is number

const v2 = getProperty2(x, "a"); // v2 is string | number | boolean

Детская площадка

0 голосов
/ 23 февраля 2020

При первом подходе вы можете сделать

getProperty<typeof x, 'a'>(x, 'a')  // Ok
getProperty<typeof x, 'a'>(x, 'b') //  Error

Вы можете указать, какой точный ключ T вы хотите использовать.

При появлении секунд вы можете использовать только любую клавишу T.

...