gpt4 book ai didi

javascript - 让 TypeScript 明白对象属性不能被取消定义?

转载 作者:行者123 更新时间:2023-12-05 02:39:42 25 4
gpt4 key购买 nike

在这里问这个是因为不确定如何正确措辞以便谷歌理解。

我有一个实用函数来将字符串中的单词大写,作为第二个参数可以传递一个选项对象:

export type Options = {
onlyFirstWord?: boolean;
separator?: string;
};

const defaultOptions = {
onlyFirstWord: false,
separator: " ",
};

export default function capitalize(
str: string,
options: Options = defaultOptions
) {}

所以第二个参数是可选的,因为我已经为它提供了一个默认值,但是如果我在类型中将属性设为可选,它需要我检查它们是否未定义,即使它们 100% 可以由于默认值,永远不会未定义。但是,如果我不将它们设为可选,则在传递选项对象时我将不得不输入每个属性,否则会报错。

我知道有很多类似的问题,但在这种情况下,除了必须加上感叹号或使用可选链接之外,是否没有办法告诉 typescript 这些值永远不会未定义?自从我为它提供默认值以来,它不应该自动发现它们永远不会未定义吗?谢谢,如果这是重复的,请告诉我,这已经得到回答。

最佳答案

这是一个playground link到一个可行的解决方案。

代码复制如下,并附上注释:

// remove the ?'s from the Options type
type Options = {
onlyFirstWord: boolean;
separator: string;
};

const defaultOptions = {
onlyFirstWord: false,
separator: "default",
};

// use this function to merge default options with Partial options
const createDefaultOptions = (options: Partial<Options>) => {
return {...defaultOptions, ...options};
}

// allow the capitalize function to take Partial options
function capitalize(
str: string,
options: Partial<Options> = defaultOptions
) {
// merge the given options with the partial options
const opts = createDefaultOptions(options);
// print the result
console.log(`${str}: ${opts.onlyFirstWord}, ${opts.separator}`);
}

// tests
capitalize('nothing');
capitalize('first', {onlyFirstWord: true});
capitalize('second', {separator: 'j'});
capitalize('both', {onlyFirstWord: true, separator: 'nice'});

输出:

nothing: false, default
first: true, default
second: false, j
both: true, nice

关于javascript - 让 TypeScript 明白对象属性不能被取消定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68959413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com